Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/388.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 永远运行卡夫卡消费者(新消费者API)_Java_Apache Kafka_Kafka Consumer Api - Fatal编程技术网

Java 永远运行卡夫卡消费者(新消费者API)

Java 永远运行卡夫卡消费者(新消费者API),java,apache-kafka,kafka-consumer-api,Java,Apache Kafka,Kafka Consumer Api,我在ApacheKafka上构建了一个排队系统。应用程序将向特定的卡夫卡主题生成消息,在使用者端,我必须使用为该主题生成的所有记录。 我使用新的Java consumer Api编写了consumer。 代码看起来像 Properties props = new Properties(); props.put("bootstrap.servers", kafkaBrokerIp+":9092"); p

我在ApacheKafka上构建了一个排队系统。应用程序将向特定的
卡夫卡主题
生成消息,在使用者端,我必须使用为该主题生成的所有记录。
我使用新的Java consumer Api编写了consumer。 代码看起来像

  Properties props = new Properties();  
                     props.put("bootstrap.servers", kafkaBrokerIp+":9092");  
                     props.put("group.id",groupId);  
                     props.put("enable.auto.commit", "true");
                     props.put("session.timeout.ms", "30000");
                     props.put("auto.offset.reset", "earliest");
        props.put("key.deserializer","org.apache.kafka.common.serialization.StringDeserializer");
        props.put("value.deserializer","org.apache.kafka.common.serialization.StringDeserializer");
        KafkaConsumer<String, String> consumer = new KafkaConsumer(props);
                     consumer.subscribe(Arrays.asList("consumertest"));  
                     while (true) {  
                         ConsumerRecords<String, String> records = consumer.poll(100);  
                         for (ConsumerRecord<String, String> record : records){  
                             System.out.println("Data recieved : "+record.value());  
                             }  
                     }
Properties=newproperties();
道具放置(“bootstrap.servers”,kafkaBrokerIp+”:9092);
props.put(“group.id”,groupId);
props.put(“enable.auto.commit”、“true”);
props.put(“session.timeout.ms”,“30000”);
道具放置(“自动偏移重置”、“最早”);
put(“key.deserializer”、“org.apache.kafka.common.serialization.StringDeserializer”);
put(“value.deserializer”、“org.apache.kafka.common.serialization.StringDeserializer”);
卡夫卡消费者=新卡夫卡消费者(道具);
consumer.subscribe(Arrays.asList(“consumertest”);
虽然(正确){
ConsumerRecords记录=consumer.poll(100);
对于(消费者记录:记录){
System.out.println(“接收的数据:+record.value());
}  
}
在这里,我需要永远运行consumer,这样制作人推送到卡夫卡主题中的任何记录都应该立即被消费和处理。

所以我的困惑是,使用无限while循环(如示例代码中所示)来使用数据是否正确

这对我来说很有效,但您可能希望将内部循环放在try/catch块中,以防抛出任何异常。如果你断开连接,也考虑一个周期性的重新连接任务。

< P>是的,你可以使用无限循环。实际上,这不是一个繁忙的循环。在每次轮询期间,如果数据不可用,则调用将等待给定的时间段

long millisToWait = 100;
consumer.poll(millisToWait);

新用户自动处理网络通信问题。确保在关机时,耗电元件正常关闭。

是的,使用无限循环消耗数据是正确的方法

消费者通常是长期运行的应用程序 不断地向卡夫卡调查更多的数据。消费者必须继续投票卡夫卡,否则他们将被考虑 死分区和他们正在使用的分区将被交给另一个分区 要继续消费的组中的消费者

poll()返回记录列表。每个记录都包含主题和分区 记录的来源、分区内记录的偏移量以及 键和记录的值。记录的处理是特定于应用程序的


如果退出循环,请在退出前始终关闭消费者()。这将关闭网络连接和套接字,还将立即触发重新平衡。

虽然可以使用无限循环,但在卡夫卡消费者中可以找到一种稍微优雅的方法,如下所示:

public class KafkaConsumerRunner implements Runnable {
    private final AtomicBoolean closed = new AtomicBoolean(false);
    private final KafkaConsumer consumer;

    public void run() {
        try {
            consumer.subscribe(Arrays.asList("topic"));
            while (!closed.get()) {
                ConsumerRecords records = consumer.poll(10000);
                // Handle new records
            }
        } catch (WakeupException e) {
            // Ignore exception if closing
            if (!closed.get()) throw e;
        } finally {
           consumer.close();
        }
    }

    // Shutdown hook which can be called from a separate thread
    public void shutdown() {
        closed.set(true);
        consumer.wakeup();
    }
}
这允许您使用钩子选择优雅的关闭