1、@EnableKafka
用于使@KafkaListener生效
2、@KafkaListener(id = "consumer8", topics = "test2")
3、引入jar包
<!--引入kafak和spring整合的jar-->
<dependency>
<groupId>org.springframework.kafka</groupId>
<artifactId>spring-kafka</artifactId>
<version>2.2.7.RELEASE</version>
</dependency>
4、配置项
spring:
kafka:
# 指定kafka 代理地址,可以多个
bootstrap-servers: 172.16.15.30:9092
consumer:
auto-offset-reset: earliest
enable-auto-commit: true
auto-commit-interval: 100
properties:
max:
poll:
interval:
ms: 600000
max-poll-records: 2
对应类:org.springframework.boot.autoconfigure.kafka.KafkaProperties
是springboot的自动配置类
5、使用ACk机制确认消费(手动提交)
只需简单的三步即可:
- 设置ENABLE_AUTO_COMMIT_CONFIG=false,禁止自动提交
- 设置AckMode=MANUAL_IMMEDIATE
- 监听方法加入Acknowledgment ack 参数
@KafkaListener(id = "consumer10", topics = "test2")
public void consumerListener(ConsumerRecord<String, String> record, Acknowledgment ack) {
System.out.println("topic.test receive : " + record.toString());
ack.acknowledge();
}
(75条消息) Spring Boot 整合——kafka消费模式AckMode以及手动消费_大风的博客-CSDN博客_ack-mode
spring-kafka之KafkaListener注解深入解读 - Enast - 博客园 (cnblogs.com)
6、消费端可靠性保证:
不重复消费;不缺失消费
(75条消息) kafka9重复消费问题解决_龙腾四海365的专栏-CSDN博客
7、源码
public @interface KafkaListener {
/**
* 消费者的id,当GroupId没有被配置的时候,默认id为GroupId
*/
String id() default "";
/**
* 监听容器工厂,当监听时需要区分单数据还是多数据消费需要配置containerFactory 属性
*/
String containerFactory() default "";
/**
* 需要监听的Topic,可监听多个,和 topicPattern 属性互斥
*/
String[] topics() default {};
/**
* 需要监听的Topic的正则表达。和 topics,topicPartitions属性互斥
*/
String topicPattern() default "";
/**
* 可配置更加详细的监听信息,必须监听某个Topic中的指定分区,或者从offset为200的偏移量开始监听,可配置该参数, 和 topicPattern 属性互斥
*/
TopicPartition[] topicPartitions() default {};
/**
*侦听器容器组
*/
String containerGroup() default "";
/**
* 监听异常处理器,配置BeanName
*/
String errorHandler() default "";
/**
* 消费组ID
*/
String groupId() default "";
/**
* id是否为GroupId
*/
boolean idIsGroup() default true;
/**
* 消费者Id前缀
*/
String clientIdPrefix() default "";
/**
* 真实监听容器的BeanName,需要在 BeanName前加 "__"
*/
String beanRef() default "__listener";
}
8、使用ConsumerRecord类消费
使用ConsumerRecord类接收有一定的好处,ConsumerRecord类里面包含分区信息、消息头、消息体等内容,如果业务需要获取这些参数时,使用ConsumerRecord会是个不错的选择。如果使用具体的类型接收消息体则更加方便,比如说用String类型去接收消息体。
==========20240202======================
1、jar包
<dependency>
<groupId>org.springframework.kafka</groupId>
<artifactId>spring-kafka</artifactId>
<version>2.8.5</version>
</dependency>
2、配置
spring:
kafka:
bootstrap-servers: 171.1.1.17:9092,112.11.1.21:9092,171.11.319.21:9092
consumer:
group-id: testGroup
auto-offset-reset: earliest
enable-auto-commit: true
auto-commit-interval: 100
key-serializer: org.apache.kafka.common.serialization.StringSerializer
value-serializer: org.apache.kafka.common.serialization.StringSerializer
3、
@KafkaListener(topics = {"qqqq"})
public void kafkaData(ConsumerRecord<String,String> message) {
System.out.println(message.value());
}
4、数据入队列时间
ConsumerRecord<String, String> message;message.timestamp()