编写没有`while`循环的Java Kafka消费者应用程序

时间:2019-06-05 10:51:17

标签: java apache-kafka kafka-consumer-api

我们最近开始使用Kafka,我正在使用Kafka Java本机消费者API编写一个Kafka消费者应用程序。

但是,我看到的大多数示例都是使用while循环,然后在循环中的使用者对象上调用poll方法。如下所示:

while (true) {
            final ConsumerRecords<Long, String> consumerRecords =
                    consumer.poll(1000);

            if (consumerRecords.count()==0) {
                noRecordsCount++;
                if (noRecordsCount > giveUp) break;
                else continue;
            }

            consumerRecords.forEach(record -> {
                System.out.printf("Consumer Record:(%d, %s, %d, %d)\n",
                        record.key(), record.value(),
                        record.partition(), record.offset());
            });

            consumer.commitAsync();
        }

我只是在寻找一种更好的方式来执行此操作,而无需使用本机Java使用者API进行循环。我知道使用spring kafka不需要编写那些。如何使用本机API?有什么好的方法或最佳做法吗?

2 个答案:

答案 0 :(得分:0)

我尝试使用调度程序,并且代码可以正常工作。

 package com.kafka;
import java.text.ParseException;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.util.Properties;
import java.util.TimerTask;
import org.apache.kafka.clients.consumer.ConsumerRecord;
import org.apache.kafka.clients.consumer.ConsumerRecords;
import org.apache.kafka.clients.consumer.KafkaConsumer;
public class ScheduledTask extends TimerTask {
 Date now; // to display current time
    public void run( ) {
        now = new Date();
    System.out.println("Time is :" + now);
    String AlarmString=null;
    Properties props = new Properties();
     props.put("bootstrap.servers", "10.*.*.*:9092");
     props.put("group.id", "grp-1");
     props.put("enable.auto.commit", "true");
     props.put("auto.commit.interval.ms", "1000");
     props.put("session.timeout.ms", "30000");
     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("RAW_MH_RAN_SAM"));
    
    ConsumerRecords<String, String> records = consumer.poll(1000);
        //ConsumerRecords<String, String> records =consumer.poll(Duration.ofMillis(100));
         for (ConsumerRecord<String, String> record : records)
         {
             
             System.out.println("Consumer:=============== partition Id= " + record.partition() + "  offset = " + record.offset() + " value = " + record.value() + "=================");
             
             if (AlarmString==null && !(record.value().toString().contains("PR ALARM:")) ){
                 
                 AlarmString=record.value(); 
                 
                }
             else{
                    if( !(record.value().toString().contains("PR ALARM:"))   )
                    
                    {
                        //System.out.println("record.value()   :::"+ record.value() );  
                        AlarmString=AlarmString+","+record.value();
                            
                    }
                    
                }
        
         }
     if (consumer != null) {
         System.out.println("Closing Connection");
         consumer.close();
      }
    
 }


}
//Simple consumer 
package com.kafka;
import org.apache.kafka.clients.consumer.ConsumerRecord;
import org.apache.kafka.clients.consumer.ConsumerRecords;
import org.apache.kafka.clients.consumer.KafkaConsumer;
import com.google.gson.Gson;
import java.text.ParseException;
import java.time.Duration;
import java.util.Arrays;
import java.util.List;
import java.util.Properties;
import java.util.Timer;
public class SimpleConsumer{
    public static void main(String[] args) 
{
    
    Timer time = new Timer();
    ScheduledTask st = new ScheduledTask(); // Instantiate SheduledTask class
    time.schedule(st, 0,60000); // Create Repetitively task for every 1 secs  
}

}

答案 1 :(得分:0)

持续轮询是“唯一”的Kafka使用者工作方式,底层Kafka协议的工作方式。 每个操作始终由客户端(推模型)发起,而不是由代理(推模型)发起,代理在消费消息的情况下会转换为轮询。 使用Java Kafka使用者API意味着要进行循环,使用调度程序或Java具有的用于连续执行代码的任何技术,您必须对其进行处理。 Spring或Smallrye反应消息传递等其他框架正是为您完成的。他们将轮询循环隐藏到您的应用程序中,但最后总会有一个循环……这就是Kafka的工作方式。