SpringBoot 集成 kafka,基于注解批量消费设置

网上关于SpringBoot 集成kafka的批量消费功能需要手动创建类(这篇文章不错:【弄nèng - Kafka】应用篇(三) —— Springboot整合Kafka(批量消费)_司马缸砸缸了-CSDN博客_kafka springboot批量消费https://blog.csdn.net/yy756127197/article/details/103895413),但是感觉对代码的改动比较大。因此花了点时间研究了一下如何简单的集成。

maven依赖

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.4.RELEASE</version>
    </parent>


    <!-- 自动引入kafka版本2.2.5.RELEASE -->
    <dependency>
      <groupId>org.springframework.kafka</groupId>
      <artifactId>spring-kafka</artifactId>
    </dependency>

配置文件

#============== kafka ===================
# 指定kafka server的地址,集群配多个,中间,逗号隔开
spring.kafka.bootstrap-servers=127.0.0.1:9092
#spring.kafka.producer.bootstrap-servers=127.0.0.1:9092
#=============== consumer  =======================
# 指定默认消费者group id --> 由于在kafka中,同一组中的consumer不会读取到同一个消息,依靠groud.id设置组名
spring.kafka.consumer.group-id=mygroup
# smallest和largest才有效,如果smallest重新0开始读取,如果是largest从logfile的offset读取。一般情况下我们都是设置smallest
spring.kafka.consumer.auto-offset-reset=latest
# enable.auto.commit:true --> 设置自动提交offset
spring.kafka.consumer.enable-auto-commit=false
#如果'enable.auto.commit'为true,则消费者偏移自动提交给Kafka的频率(以毫秒为单位),默认值为5000。
spring.kafka.consumer.auto-commit-interval=100
# 指定消息key和消息体的编解码方式
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.poll-timeout=1000
spring.kafka.listener.type=batch
spring.kafka.listener.concurrency=1
spring.kafka.consumer.max-poll-records=1000

最后几个批量设置的关键配置:

  • spring.kafka.listener.poll-timeout=1000  #看了说明也没搞懂这个参数什么作用,无论设置大小对后续的测试没有任何影响,有知道的大神还望点拨下
  • spring.kafka.listener.type=batch             #指定监听的模式,好多文章里没有此项
  • spring.kafka.listener.concurrency=1       #同时处理线程数,应设置与brocker数量一致,由于测试服务器没有多个brocker,因此不知道影响
  • spring.kafka.consumer.max-poll-records=1000 #每批最大条数,默认500

消费者代码:仅观察接收到的集合大小

    @KafkaListener(topics = "MY_TOPIC")
    public void myListener(List<ConsumerRecord<Integer, JSONObject>> list){
        System.out.print(list.size()+",");
        /* list.forEach( it -> {
            System.out.println(it.value());
        });*/
    }

    //参数可以使用泛型 List<ConsumerRecord<?, ?>>

生产者测试

public static void myTest(){
        Properties p = new Properties();
        p.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "127.0.0.1:9092");
        p.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class);
        p.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, StringSerializer.class);
        KafkaProducer<String, String> kafkaProducer = new KafkaProducer<>(p);

        Random random = new Random();
        for(int i=0;i<20000;i++){
            JSONObject jsonObject = new JSONObject();
            jsonObject.put("productName", random.nextInt(10));
            jsonObject.put("couponCount", random.nextInt(50));
            jsonObject.put("siteId",random.nextInt(5));
            ProducerRecord<String, String> recordTopic5 =  new ProducerRecord<String, String>("MY_TOPIC", jsonObject.toString());
            kafkaProducer.send(recordTopic5);
            /*try {
                Thread.sleep(10);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }*/
        }
        kafkaProducer.close();
    }

测试结果

模拟生产者发消息时的不连续性,对消费者批量接受消息数量的影响

没有sleep时:

sleep=1时:

sleep=10时:

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,我可以为你提供一些简单的指导。首先,你需要在你的Spring Boot项目中添加Kafka的依赖,可以在pom.xml文件中添加如下代码: ```xml <dependency> <groupId>org.springframework.kafka</groupId> <artifactId>spring-kafka</artifactId> <version>2.8.0</version> </dependency> ``` 接下来,你需要创建一个Kafka的生产者和消费者。你可以使用Spring Boot提供的KafkaTemplate来创建一个生产者,代码如下: ```java @Autowired private KafkaTemplate<String, String> kafkaTemplate; public void sendMessage(String message) { kafkaTemplate.send("test_topic", message); } ``` 上述代码中,我们使用@Autowired注解来自动注入KafkaTemplate实例,并且使用send()方法来发送消息到名为“test_topic”的Kafka主题。 对于消费者,你需要创建一个Kafka监听器来监听Kafka主题中的消息,代码如下: ```java @Service public class KafkaConsumer { @KafkaListener(topics = "test_topic") public void consume(String message) { System.out.println("Received message: " + message); } } ``` 上述代码中,我们使用@Service注解KafkaConsumer类声明为Spring Boot的服务,并且使用@KafkaListener注解指定监听的Kafka主题为“test_topic”。当收到消息时,consume()方法将会被调用,并打印出接收到的消息。 最后,你还需要添加一个定时任务来定时消费Kafka消息。你可以使用Spring Boot提供的@Scheduled注解来创建定时任务,代码如下: ```java @Service public class KafkaConsumer { @Autowired private KafkaTemplate<String, String> kafkaTemplate; @KafkaListener(topics = "test_topic") public void consume(String message) { System.out.println("Received message: " + message); } @Scheduled(fixedDelay = 5000) public void consumeMessages() { // poll messages from Kafka } } ``` 上述代码中,我们使用@Scheduled注解创建一个每5秒钟调用一次的定时任务,并在consumeMessages()方法中添加代码来从Kafka中拉取消息。 希望这些代码对你有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

as350144

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值