kafka多线程消费

Posted liaoyanglong

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了kafka多线程消费相关的知识,希望对你有一定的参考价值。

建立kafka消费类ConsumerRunnable ,实现Runnable接口:

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.apache.kafka.clients.consumer.ConsumerRecord;
import org.apache.kafka.clients.consumer.ConsumerRecords;
import org.apache.kafka.clients.consumer.KafkaConsumer;

import java.util.*;

/**
 * @Auther: lyl
 * @Date: 2019/9/12 16:28
 * @Description:
 */
@Slf4j
public class ConsumerRunnable implements Runnable {

    // 每个线程维护私有的KafkaConsumer实例
    private final KafkaConsumer<String, String> consumer;


    public ConsumerRunnable(String brokerList, String groupId, String topic) {
        Properties props = new Properties();
        props.put("bootstrap.servers", brokerList);
        props.put("group.id", groupId);
        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");
        this.consumer = new KafkaConsumer<>(props);
        consumer.subscribe(Arrays.asList(topic));
    }

    @Override
    public void run() {
        try {
            while (true) {
                try {
                    ConsumerRecords<String, String> records = consumer.poll(100);   // 本例使用100ms作为获取超时时间
                    for (ConsumerRecord<String, String> record : records) {
                        // 这里面写处理消息的逻辑
                        String value = record.value();
                        if (value.startsWith("obj_vehicle_pass")) {
//                            System.out.println(value);
                            value = value.substring(17, value.length());
                            JSONObject parse = JSONObject.parseObject(value);

                        }
                    }

                } catch (Exception e) {
                    log.error("kafka数据消费异常=============");
                    e.printStackTrace();
                }
            }
        } catch (Exception e) {
            log.error("初始化kafka异常=============");
            e.printStackTrace();
        }
    }

}

  在编写一个类,用来初始化上面这个类,并通过线程启动

import java.util.ArrayList;
import java.util.List;


/**
 * @Auther: lyl
 * @Date: 2019/9/12 16:29
 * @Description:
 */
public class ConsumerGroup {
    private List<ConsumerRunnable> consumers;

    public ConsumerGroup(int consumerNum, String groupId, String topic, String brokerList) {
        consumers = new ArrayList<>(consumerNum);
        for (int i = 0; i < consumerNum; ++i) {
            ConsumerRunnable consumerThread = new ConsumerRunnable(brokerList, groupId, topic);
            consumers.add(consumerThread);
        }
    }

    public void execute() {
        for (ConsumerRunnable task : consumers) {
            new Thread(task).start();
        }
    }

}

  最后项目启动时先初始化一下ConsumerGroup这个类,在调用一下execute()方法就能进行消费

以上是关于kafka多线程消费的主要内容,如果未能解决你的问题,请参考以下文章

kafka多线程消费

kafka浅谈Kafka的多线程消费的设计

kafka Consumer分区数与多线程消费topic

kafka消费者java版本读取不到消息怎么办

Kafka分区数与消费者个数

MySQL系列:kafka停止命令