单独KafkaConsumer实例and多worker线程。
1、单独KafkaConsumer实例and多worker线程。
将获取的消息和消息的处理解耦,将消息的处理放入单独的工作者线程中,即工作线程中,同时维护一个或者若各干consumer实例执行消息获取任务。
本例使用全局的KafkaConsumer实例执行消息获取,然后把获取到的消息集合交给线程池中的worker线程执行工作,之后worker线程完成处理后上报位移状态,由全局consumer提交位移。
1 package com.bie.kafka.kafkaWorker; 2 3 import java.time.Duration; 4 import java.util.Arrays; 5 import java.util.Collection; 6 import java.util.Collections; 7 import java.util.HashMap; 8 import java.util.Map; 9 import java.util.Properties; 10 import java.util.concurrent.ArrayBlockingQueue; 11 import java.util.concurrent.ExecutorService; 12 import java.util.concurrent.ThreadPoolExecutor; 13 import java.util.concurrent.TimeUnit; 14 15 import org.apache.kafka.clients.consumer.ConsumerRebalanceListener; 16 import org.apache.kafka.clients.consumer.ConsumerRecords; 17 import org.apache.kafka.clients.consumer.KafkaConsumer; 18 import org.apache.kafka.clients.consumer.OffsetAndMetadata; 19 import org.apache.kafka.common.TopicPartition; 20 import org.apache.kafka.common.errors.WakeupException; 21 22 /** 23 * 24 * @Description TODO 25 * @author biehl 26 * @Date 2019年6月1日 下午3:28:53 27 * 28 * @param <K> 29 * @param <V> 30 * 31 * 1、consumer多线程管理类,用于创建线程池以及为每个线程分配消息集合。 另外consumer位移提交也在该类中完成。 32 * 33 */ 34 public class ConsumerThreadHandler<K, V> { 35 36 // KafkaConsumer实例 37 private final KafkaConsumer<K, V> consumer; 38 // ExecutorService实例 39 private ExecutorService executors; 40 // 位移信息offsets 41 private final Map<TopicPartition, OffsetAndMetadata> offsets = new HashMap<>(); 42 43 /** 44 * 45 * @param brokerList 46 * kafka列表 47 * @param groupId 48 * 消费组groupId 49 * @param topic 50 * 主题topic 51 */ 52 public ConsumerThreadHandler(String brokerList, String groupId, String topic) { 53 Properties props = new Properties(); 54 // broker列表 55 props.put("bootstrap.servers", brokerList); 56 // 消费者组编号Id 57 props.put("group.id", groupId); 58 // 非自动提交位移信息 59 props.put("enable.auto.commit", "false"); 60 // 从最早的位移处开始消费消息 61 props.put("auto.offset.reset", "