59
59
import java .util .concurrent .Future ;
60
60
import java .util .concurrent .TimeUnit ;
61
61
import java .util .concurrent .atomic .AtomicLong ;
62
- import java .util .concurrent .atomic .LongAdder ;
63
62
import java .util .stream .Collectors ;
64
63
import java .util .stream .Stream ;
65
64
@@ -105,17 +104,9 @@ public int createConsumers(List<Topic> topics, ConsumersConfig config) {
105
104
106
105
public void start (ConsumerCallback callback , int pollRate ) {
107
106
BlockingBucket bucket = rateLimitBucket (pollRate );
108
- LongAdder counter = new LongAdder ();
109
- ConsumerCallback callbackWithRateLimit = (tp , p , st ) -> {
110
- callback .messageReceived (tp , p , st );
111
- counter .increment ();
112
- if ((counter .sum ()) % 1000 == 0 ) {
113
- bucket .consume (1 );
114
- }
115
- };
116
107
CompletableFuture .allOf (
117
108
groups .stream ()
118
- .map (group -> group .start (callbackWithRateLimit ))
109
+ .map (group -> group .start (callback , bucket ))
119
110
.toArray (CompletableFuture []::new )
120
111
).join ();
121
112
}
@@ -282,8 +273,8 @@ public Group(int index, int consumersPerGroup, List<Topic> topics, ConsumersConf
282
273
}
283
274
}
284
275
285
- public CompletableFuture <Void > start (ConsumerCallback callback ) {
286
- consumers ().forEach (consumer -> consumer .start (callback ));
276
+ public CompletableFuture <Void > start (ConsumerCallback callback , BlockingBucket bucket ) {
277
+ consumers ().forEach (consumer -> consumer .start (callback , bucket ));
287
278
288
279
// wait for all consumers to join the group
289
280
return CompletableFuture .allOf (consumers ()
@@ -382,8 +373,8 @@ public Consumer(Properties properties, String topic) {
382
373
consumer .subscribe (List .of (topic ), subscribeListener ());
383
374
}
384
375
385
- public void start (ConsumerCallback callback ) {
386
- this .task = this .executor .submit (() -> pollRecords (consumer , callback ));
376
+ public void start (ConsumerCallback callback , BlockingBucket bucket ) {
377
+ this .task = this .executor .submit (() -> pollRecords (consumer , callback , bucket ));
387
378
}
388
379
389
380
public CompletableFuture <Void > started () {
@@ -413,7 +404,7 @@ public void onPartitionsAssigned(Collection<TopicPartition> partitions) {
413
404
};
414
405
}
415
406
416
- private void pollRecords (KafkaConsumer <String , byte []> consumer , ConsumerCallback callback ) {
407
+ private void pollRecords (KafkaConsumer <String , byte []> consumer , ConsumerCallback callback , BlockingBucket bucket ) {
417
408
while (!closing ) {
418
409
try {
419
410
while (paused ) {
@@ -425,6 +416,7 @@ private void pollRecords(KafkaConsumer<String, byte[]> consumer, ConsumerCallbac
425
416
TopicPartition topicPartition = new TopicPartition (record .topic (), record .partition ());
426
417
callback .messageReceived (topicPartition , record .value (), sendTimeNanos );
427
418
}
419
+ bucket .consume (records .count ());
428
420
} catch (InterruptException | InterruptedException e ) {
429
421
// ignore, as we are closing
430
422
} catch (Exception e ) {
0 commit comments