@@ -45,6 +45,7 @@ public class PartitionSessionImpl {
4545 private final PartitionSession sessionInfo ;
4646 private final Executor decompressionExecutor ;
4747 private final AtomicBoolean isWorking = new AtomicBoolean (true );
48+ private final int maxBatchSize ;
4849
4950 private final Queue <Batch > decodingBatches = new LinkedList <>();
5051 private final ReentrantLock decodingBatchesLock = new ReentrantLock ();
@@ -60,6 +61,7 @@ public class PartitionSessionImpl {
6061
6162 private PartitionSessionImpl (Builder builder ) {
6263 this .id = builder .id ;
64+ this .maxBatchSize = builder .maxBatchSize ;
6365 this .fullId = builder .fullId ;
6466 this .topicPath = builder .topicPath ;
6567 this .consumerName = builder .consumerName ;
@@ -308,21 +310,43 @@ private void sendDataToReadersIfNeeded() {
308310 return ;
309311 }
310312 if (isReadingNow .compareAndSet (false , true )) {
311- Batch batchToRead = readingQueue .poll ();
312- if (batchToRead == null ) {
313+ List <Batch > batchesToRead = new ArrayList <>();
314+
315+ Batch next = readingQueue .poll ();
316+ if (next == null ) {
313317 isReadingNow .set (false );
314318 return ;
315319 }
320+
321+ batchesToRead .add (next );
322+ List <Message > messagesToRead = new ArrayList <>(next .getMessages ());
323+ long commitFrom = next .getFirstCommitOffsetFrom ();
324+ long commitTo = next .getLastOffset () + 1 ;
325+
326+ int batchSize = messagesToRead .size ();
327+ while (maxBatchSize <= 0 || batchSize < maxBatchSize ) {
328+ next = readingQueue .peek ();
329+ if (next == null ) {
330+ break ;
331+ }
332+ if (maxBatchSize > 0 && next .getMessages ().size () + batchSize > maxBatchSize ) {
333+ break ;
334+ }
335+
336+ next = readingQueue .poll ();
337+
338+ batchesToRead .add (next );
339+ messagesToRead .addAll (next .getMessages ());
340+ batchSize += next .getMessages ().size ();
341+ commitTo = next .getLastOffset () + 1 ;
342+ }
343+
316344 // Should be called maximum in 1 thread at a time
317- List <MessageImpl > messageImplList = batchToRead .getMessages ();
318- List <Message > messagesToRead = new ArrayList <>(messageImplList );
319- OffsetsRange offsetsToCommit = new OffsetsRangeImpl (messageImplList .get (0 ).getCommitOffsetFrom (),
320- messageImplList .get (messageImplList .size () - 1 ).getOffset () + 1 );
345+ OffsetsRange offsetsToCommit = new OffsetsRangeImpl (commitFrom , commitTo );
321346 DataReceivedEvent event = new DataReceivedEventImpl (this , messagesToRead , offsetsToCommit );
322347 if (logger .isDebugEnabled ()) {
323348 logger .debug ("[{}] DataReceivedEvent callback with {} message(s) (offsets {}-{}) is about " +
324- "to be called..." , fullId , messagesToRead .size (), messagesToRead .get (0 ).getOffset (),
325- messagesToRead .get (messagesToRead .size () - 1 ).getOffset ());
349+ "to be called..." , fullId , messagesToRead .size (), commitFrom , commitTo );
326350 }
327351 dataEventCallback .apply (event )
328352 .whenComplete ((res , th ) -> {
@@ -338,7 +362,7 @@ private void sendDataToReadersIfNeeded() {
338362 messagesToRead .get (messagesToRead .size () - 1 ).getOffset ());
339363 }
340364 isReadingNow .set (false );
341- batchToRead . complete ( );
365+ batchesToRead . forEach ( Batch :: complete );
342366 sendDataToReadersIfNeeded ();
343367 });
344368 } else {
@@ -376,6 +400,7 @@ public void shutdown() {
376400 */
377401 public static class Builder {
378402 private long id ;
403+ private int maxBatchSize ;
379404 private String fullId ;
380405 private String topicPath ;
381406 private String consumerName ;
@@ -391,6 +416,11 @@ public Builder setId(long id) {
391416 return this ;
392417 }
393418
419+ public Builder setMaxBatchSize (int maxBatchSize ) {
420+ this .maxBatchSize = maxBatchSize ;
421+ return this ;
422+ }
423+
394424 public Builder setFullId (String fullId ) {
395425 this .fullId = fullId ;
396426 return this ;
0 commit comments