public class MyTestThreads {
public static void main(String[] args) {
//因为KafkaConsumer不是线程安全的,使用一个对象会报异常
//ConcurrentModificationException: KafkaConsumer is not safe for multi-threaded access
new Thread(new MyConsumerThread(),"a").start();
new Thread(new MyConsumerThread(),"b").start();
}
}
class MyConsumerThread implements Runnable {
KafkaConsumer<String, String> consumer;
public MyConsumerThread(){
Properties properties = PropertyUtil.properties;
consumer = new KafkaConsumer<>(properties);
}
@Override
public void run() {
consumer.subscribe(Arrays.asList("dai"));
while(true){
ConsumerRecords<String,String> records = consumer.poll(1000);
for (ConsumerRecord<String, String> record : records) {
System.out.println(Thread.currentThread().getName()+"进行了消费"+record.value()+"分区是"+record.partition()+"偏移量是"+record.offset());
}
}
}
}
测试
a进行了消费ddd分区是0偏移量是15
b进行了消费eee分区是2偏移量是17
a进行了消费wade分区是1偏移量是17
a进行了消费pual分区是0偏移量是16
关掉,kafka继续向主题生产,然后再启动,可以看见从保存的offset继续消费
b进行了消费james分区是2偏移量是18
a进行了消费antony分区是1偏移量是18
a进行了消费kobe分区是0偏移量是17