Java实现kafka消费者

该博客展示了如何配置Spring Kafka消费者连接Kafka,并实现批量消费数据到Elasticsearch(ES)库。配置包括消费者的基本设置,如自动提交、批处理大小和超时时间。代码中定义了Kafka监听器工厂,用于创建并发消费者,并监听特定主题。消费到ES的过程通过监听Kafka消息,将数据转化为ES的索引请求并批量保存。
摘要由CSDN通过智能技术生成

 消费者基本配置及代码:

#spring.kafka.client-id=
spring.kafka.bootstrap-servers=localhost:9092
###########【消费者基本配置】###########
#spring.kafka.consumer.client-id=
spring.kafka.consumer.properties.group.id=test01
spring.kafka.consumer.enable-auto-commit=true
spring.kafka.consumer.auto-commit-interval-ms=1000
spring.kafka.consumer.auto-offset-reset=latest
spring.kafka.consumer.properties.session.timeout.ms=120000
spring.kafka.consumer.properties.request.timeout.ms=180000
spring.kafka.consumer.key-deserializer=org.apache.kafka.common.serialization.StringDeserializer
spring.kafka.consumer.value-deserializer=org.apache.kafka.common.serialization.StringDeserializer
#spring.kafka.listener.concurrency=4
spring.kafka.listener.missing-topics-fatal=false
@Configuration
public class KafkaConfiguration {

    @Value("${spring.kafka.bootstrap-servers}")
    private String bootstrapServers;

    @Value("${spring.kafka.consumer.enable-auto-commit}")
    private Boolean autoCommit;

    @Value("${spring.kafka.consumer.auto-commit-interval-ms}")
    private Integer autoCommitInterval;


    @Value("3000")
    private Integer maxNum;
    @Value("1048576")//最大数据大小为10M
    private Integer maxBytes;


    @Value("${spring.kafka.consumer.auto-offset-reset}")
    private String autoOffsetReset;

    @Value("${spring.kafka.consumer.key-deserializer}")
    private String keyDeserializer;
    @Value("${spring.kafka.consumer.value-deserializer}")
    private String valDeserializer;
    /**
     * 监听器工厂 批量消费
     * @return
     */
    @Bean
    public KafkaListenerContainerFactory<ConcurrentMessageListenerContainer<Integer, String>> kafkaListenerFactory() {
        ConcurrentKafkaListenerContainerFactory<Integer, String> factory =
                new ConcurrentKafkaListenerContainerFactory<>();
        factory.setConsumerFactory(new DefaultKafkaConsumerFactory<>(consumerConfigs()));
        //设置为批量消费,每个批次数量在Kafka配置参数中设置ConsumerConfig.MAX_POLL_RECORDS_CONFIG
        factory.setBatchListener(true);
        //设置要监听的线程数。(设置10个消费者进行消费。)
        factory.setConcurrency(10);
        return factory;
    }
    @Bean
    public Map<String, Object> consumerConfigs() {   
        Map<String, Object> props = new HashMap<>();
        props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, bootstrapServers);
        props.put(ConsumerConfig.ENABLE_AUTO_COMMIT_CONFIG, autoCommit);
        props.put(ConsumerConfig.AUTO_COMMIT_INTERVAL_MS_CONFIG, autoCommitInterval);
        props.put(ConsumerConfig.SESSION_TIMEOUT_MS_CONFIG, "15000");
        props.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, keyDeserializer);
        props.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, valDeserializer);
        props.put(ConsumerConfig.MAX_PARTITION_FETCH_BYTES_CONFIG,maxBytes);//每一批
        props.put(ConsumerConfig.MAX_POLL_RECORDS_CONFIG, maxNum);//每一批最多数量
        props.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, autoOffsetReset);
        return props;
    }
}

 代码实现消费者连接kafka消费数据到es库:

@Component
public class NewWebsiteAlertConsumer {

    @Autowired
    private RestHighLevelClient client;

    @Value("test_index")
    private String TEST_INDEX;

    // 配置要监听的主题、消费者组、消费者工厂
    @KafkaListener(
            id = "nw0",
            groupId = "TESTCONSUMER",
            topics = test01,
            containerFactory = "kafkaListenerFactory"
    )
    public void newbulkWebsiteAlert(List<ConsumerRecord<?, ?>> records){
        if (CollectionUtils.isEmpty(records)) {
            return;
        }
        try {
            BulkRequest firstBulkRequest = new BulkRequest();  // 不新建 会 重复插入,不然就指定id

            for (ConsumerRecord<?, ?> record : records) {
                TestData value = JSON.parseObject(record.value().toString(), TestData.class);
                String id = DigestUtils.md5Hex(value.getId());
                IndexRequest indexRequest = new IndexRequest(TEST_INDEX);
                indexRequest.id(id);
                indexRequest.source(JSON.toJSONString(value), XContentType.JSON);//推荐添加string类型的,并且是json格式
                firstBulkRequest.add(indexRequest);//可以添加其他的请求的
            }

            client.bulk(firstBulkRequest, RequestOptions.DEFAULT);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以为您提供有关Java实现Kafka消费并回调的帮助。在Java中,您可以使用Kafka的Consumer API来实现消费者逻辑,并使用Kafka的Callback机制来回调处理结果。以下是示例代码: ```java import org.apache.kafka.clients.consumer.*; import org.apache.kafka.common.TopicPartition; import java.util.*; public class MyKafkaConsumer { private static final String TOPIC_NAME = "my-topic"; // Kafka主题名称 private static final String GROUP_ID = "my-group"; // 消费者组ID public static void main(String[] args) { Properties props = new Properties(); props.put("bootstrap.servers", "localhost:9092"); // Kafka集群地址 props.put("group.id", GROUP_ID); props.put("enable.auto.commit", "false"); // 手动提交消费位移 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(Collections.singletonList(TOPIC_NAME), new ConsumerRebalanceListener() { @Override public void onPartitionsRevoked(Collection<TopicPartition> partitions) { // 消费者停止消费分区时调用 consumer.commitSync(currentOffsets()); } @Override public void onPartitionsAssigned(Collection<TopicPartition> partitions) { // 消费者开始消费分区时调用 } }); try { while (true) { ConsumerRecords<String, String> records = consumer.poll(1000); // 拉取消息 for (ConsumerRecord<String, String> record : records) { System.out.printf("消费消息: partition = %d, offset = %d, key = %s, value = %s%n", record.partition(), record.offset(), record.key(), record.value()); // TODO: 处理消息逻辑 } consumer.commitAsync(); // 异步提交消费位移 } } finally { consumer.close(); // 关闭消费者 } } // 获取当前消费者消费位移 private static Map<TopicPartition, OffsetAndMetadata> currentOffsets() { Map<TopicPartition, OffsetAndMetadata> currentOffsets = new HashMap<>(); for (TopicPartition partition : consumer.assignment()) { currentOffsets.put(partition, new OffsetAndMetadata(consumer.position(partition))); } return currentOffsets; } } ``` 以上代码实现了一个简单的Kafka消费者,并使用了手动提交消费位移以及异步提交消费位移的方式。同时,代码还实现了ConsumerRebalanceListener接口来监听消费者停止消费分区以及开始消费分区的事件。 希望这个例子能够帮助您理解如何在Java实现Kafka消费并回调。如果您有任何其他问题,请随时与我交流。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值