Java 如何在Kafka中使用多线程

Java 如何在Kafka中使用多线程,java,multithreading,apache-kafka,Java,Multithreading,Apache Kafka,我正在尝试使用Java多线程从producer读取kafka消息 假设,卡夫卡制作人向卡夫卡消费者发送多条消息。那么,如何使用JAVA中的ExecutorService分别读取这些多条消息,我已经实现了您提到的案例,我将分享您应该遵循的步骤 创建一个必须实现可运行接口的使用者类,它必须有一个Kafkaconsumer实例作为类成员。您可以在构造函数方法中配置使用者属性。 public LogConsumer(List<String> topics, String group, Str

我正在尝试使用Java多线程从producer读取kafka消息


假设,卡夫卡制作人卡夫卡消费者发送多条消息。那么,如何使用JAVA中的ExecutorService分别读取这些多条消息,我已经实现了您提到的案例,我将分享您应该遵循的步骤

创建一个必须实现可运行接口的使用者类,它必须有一个Kafkaconsumer实例作为类成员。您可以在构造函数方法中配置使用者属性。

public LogConsumer(List<String> topics, String group, String brokerList) {

    Properties propsConsumer = new Properties();
    propsConsumer.put("bootstrap.servers", brokerList);
    propsConsumer.put("group.id", group);
    propsConsumer.put("enable.auto.commit", "false");
    propsConsumer.put("key.deserializer", StringDeserializer.class);
    propsConsumer.put("value.deserializer", ByteArrayDeserializer.class);
    propsConsumer.put("auto.offset.reset", "latest");

    this.consumer = new KafkaConsumer(propsConsumer);
    this.consumer.subscribe(topics);
}
公共日志使用者(列出主题、字符串组、字符串代理列表){
Properties propsConsumer=新属性();
propsConsumer.put(“bootstrap.servers”,brokerList);
propsConsumer.put(“group.id”,group);
propsConsumer.put(“enable.auto.commit”、“false”);
propsConsumer.put(“key.deserializer”,StringDeserializer.class);
propsConsumer.put(“value.deserializer”,byteArraydSerializer.class);
propsConsumer.put(“自动偏移重置”、“最新”);
this.consumer=新卡夫卡消费者(propsConsumer);
this.consumer.subscribe(主题);
}
然后,在run方法中,您可以使用下面共享的每个kafka消息

public void run() {
    try {
        while (!flagOfThread) {
            ConsumerRecords<String, byte []> records = consumer.poll(10000);
            for (ConsumerRecord<String, byte []> record : records) {
                handleRecord(record);
            }
            // At least one
            consumer.commitSync();
        }
    } catch (WakeupException e) {
        // Ignore exception if closing
        if (!flagOfThread){
            LOG.error("Log Consumer is shutting down.",e);
        }

    } finally {
        consumer.close();
    }
}
public void run(){
试一试{
而(!flagOfThread){
ConsumerRecords记录=consumer.poll(10000);
对于(消费者记录:记录){
handleRecord(记录);
}
//至少一个
consumer.commitSync();
}
}捕获(唤醒异常e){
//关闭时忽略异常
如果(!flagOfThread){
LOG.error(“日志使用者正在关闭。”,e);
}
}最后{
consumer.close();
}
}
在application runner类中,您应该创建一个线程池,该线程池计数必须等于主题分区计数

 ExecutorService executorService = Executors.newFixedThreadPool(parallelismCount);
    for (int i = 0; i < parallelismCount; i++) {
        ExecutionLogConsumer bean = new LogConsumer(/*parameters*/);
        executorService.execute(bean);
    }
ExecutorService ExecutorService=Executors.newFixedThreadPool(parallelismCount);
for(int i=0;i

现在您可以开始使用来自kafka的消息:)

这不是关于kafka的问题,而是关于如何使用java executor服务或多线程api的问题。executor服务您可以使用Future或Threadpool,具体取决于您的喜好。然后,每个线程都可以订阅主题并流式传输消息。你应该描述更多你真正想做的事情。这可能是最好的方法,而不是使用ExecutorService