package de.juplo.kafka;
import lombok.extern.slf4j.Slf4j;
+import org.apache.kafka.clients.consumer.ConsumerRebalanceListener;
import org.apache.kafka.clients.consumer.ConsumerRecord;
import org.apache.kafka.clients.consumer.ConsumerRecords;
import org.apache.kafka.clients.consumer.KafkaConsumer;
+import org.apache.kafka.common.TopicPartition;
import org.apache.kafka.common.errors.WakeupException;
import org.apache.kafka.common.serialization.StringDeserializer;
import javax.annotation.PreDestroy;
import java.time.Duration;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Properties;
+import java.util.*;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Future;
private KafkaConsumer<String, String> consumer = null;
private Future<?> future = null;
- private Map<Integer, Map<String, Integer>> seen;
+ private final Map<Integer, Map<String, Integer>> seen = new HashMap<>();
public EndlessConsumer(
this.consumer = new KafkaConsumer<>(props);
log.info("{} - Subscribing to topic {}", id, topic);
- consumer.subscribe(Arrays.asList(topic));
+ consumer.subscribe(Arrays.asList(topic), new ConsumerRebalanceListener()
+ {
+ @Override
+ public void onPartitionsRevoked(Collection<TopicPartition> partitions)
+ {
+ partitions.forEach(tp -> seen.remove(tp.partition()));
+ }
- seen = new HashMap<>();
+ @Override
+ public void onPartitionsAssigned(Collection<TopicPartition> partitions)
+ {
+ partitions.forEach(tp -> seen.put(tp.partition(), new HashMap<>()));
+ }
+ });
while (true)
{
Integer partition = record.partition();
String key = record.key() == null ? "NULL" : record.key();
-
- if (!seen.containsKey(partition))
- seen.put(partition, new HashMap<>());
-
Map<String, Integer> byKey = seen.get(partition);
if (!byKey.containsKey(key))
key);
}
}
- seen = null;
log.info("{} - Consumer-Thread exiting", id);
}