SpringBoot——》@KafkaListener

推荐链接:
    总结——》【Java】
    总结——》【Mysql】
    总结——》【Redis】
    总结——》【Spring】
    总结——》【SpringBoot】
    总结——》【MyBatis、MyBatis-Plus】

方法功能
String id() default “”;监听器id
String containerFactory() default “”;监听器工厂
String[] topics() default {};监听器topics
String topicPattern() default “”;监听器topics匹配正则表达式
TopicPartition[] topicPartitions() default {};监听器分区
String errorHandler() default “”;异常处理器
String groupId() default “”;分组id
boolean idIsGroup() default true;是否使用id作为groupId

一、监听器id

@KafkaListener(id = "listenerForSyncEsfCommunity", topics = "test_topic1")

1、在相同容器中,监听器id不能重复

如果ID重复,会报错Caused by: java.lang.IllegalStateException: Another endpoint is already registered with id

2、使用默认配置的消费组

kafka.consumer.group-id = xxxxx

// 消费组为xxxxx
@KafkaListener(id = "listenerForSyncEsfCommunity",idIsGroup = false)

3、使用自定义的消费组

// 方式一:消费组为listenerForSyncEsfCommunity
@KafkaListener(id = "listenerForSyncEsfCommunity")

// 方式二:消费组为groupId-test
@KafkaListener(id = "listenerForSyncEsfCommunity",idIsGroup = false,groupId = "groupId-test")

二、监听器工厂

1、定义kafkaListenerContainerFactory

@Bean("kafkaListenerContainerFactory")
KafkaListenerContainerFactory<ConcurrentMessageListenerContainer<String, String>> kafkaListenerContainerFactory() {
    ConcurrentKafkaListenerContainerFactory<String, String> factory = new ConcurrentKafkaListenerContainerFactory<>();
    // consumerGroupId为空时,会用默认的groupId
    factory.setConsumerFactory(consumerFactory("g1"));
    factory.setConcurrency(4);
    // 设置为批量消费,每个批次数量在Kafka配置参数中设置ConsumerConfig.MAX_POLL_RECORDS_CONFIG
    factory.setBatchListener(true);
    factory.getContainerProperties().setPollTimeout(3000);
    return factory;
}

2、配置containerFactory参数

@KafkaListener(id = "listenerForSyncEsfCommunity", topics = "test_topic1", containerFactory = "kafkaListenerContainerFactory")

三、监听器topics

1、固定监听topics

// 指定多个topic
@KafkaListener(id = "listenerForSyncEsfCommunity", topics = {"test_topic1","test_topic2"})

2、动态监听topics

自定义配置:kafka.consumer.topics=topic1,topic2

// Spring的SpEl表达式
@KafkaListener(topics = "#{'${kafka.consumer.topics}'.split(',')}")

四、监听器topics匹配正则表达式

@KafkaListener(id = "listenerForSyncEsfCommunity", topicPattern = "test_.*topic.*")

五、监听器分区

@KafkaListener(id = "listenerForSyncEsfCommunity",  topicPartitions =
        { @TopicPartition(topic = "topic1", partitions = { "0", "1" }),
          @TopicPartition(topic = "topic2", partitions = "0")
        })

六、异常处理器

异常处理有2种方式:

  • 方式一:consumer中手动try/catch
  • 方式二:实现KafkaListenerErrorHandler,重写异常处理逻辑

1、实现KafkaListenerErrorHandler

@Component("kafkaErrorHandler")
    public class KafkaDefaultListenerErrorHandler implements KafkaListenerErrorHandler {
        @Override
        public Object handleError(Message<?> message, ListenerExecutionFailedException exception) {
            return null;
        }

        @Override
        public Object handleError(Message<?> message, ListenerExecutionFailedException exception, Consumer<?, ?> consumer) {
            //TODO
            return null;
        }
    }

2、配置errorHandler参数

// 调用的时候errorHandler的值填写beanName
@KafkaListener(id = "listenerForSyncEsfCommunity", topics = "topic1",errorHandler = "kafkaErrorHandler")

七、分组id

参考监听器id

八、是否使用id作为groupId

参考监听器id

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值