}
try {
final MessageSet set =
store.slice(request.getOffset(),
Math.min(this.metaConfig.getMaxTransferSize(), request.getMaxSize()));
ConsumerMessageFilter filter = this.consumerFilterManager.findFilter(topic, group);
if (set != null) {
if (zeroCopy && filter == null) {
set.write(request, ctx);
return null;
}
else {
// refer to the code of line 440 in MessageStore
// create two copies of byte array including the byteBuffer
// and new bytes
// this may not a good use case of Buffer
final ByteBuffer byteBuffer =
ByteBuffer.allocate(Math.min(this.metaConfig.getMaxTransferSize(), request.getMaxSize()));
set.read(byteBuffer);
byte[] bytes = this.getBytesFromBuffer(byteBuffer);
// If filter is not null,we filter the messages by it.
if (filter != null) {
MessageIterator it = new MessageIterator(topic, bytes);
// reuse the buffer.
byteBuffer.clear();
while (it.hasNext()) {
Message msg = it.next();
try {
if (filter.accept(group, msg)) {
ByteBuffer msgBuf = it.getCurrentMsgBuf();
// Append current message buffer to result
// buffer.
byteBuffer.put(msgBuf);
}
}
catch (Exception e) {
log.error("Filter message for consumer failed,topic=" + topic + ",group=" + group
+ ",filterClass=" + filter.getClass().getCanonicalName(), e);
}
}
// re-new the byte array.
bytes = this.getBytesFromBuffer(byteBuffer);
// All these messages are not acceptable,move forward