Spring boot 以编程方式配置侦听器,而不是使用注释

Spring boot 以编程方式配置侦听器,而不是使用注释,spring-boot,spring-kafka,Spring Boot,Spring Kafka,我已经: 您可以通过配置MessageListenerContainer并提供消息侦听器或使用@KafkaListener注释来接收消息 然而,我不能完全让它工作。我使用的是Spring Boot 2.1.2,而且可能会在春汤中销售过多的豆子,这些豆子对我来说弊大于利,所以我想了解它是如何工作的,这样我就可以检查我偏离荣耀之路的地方了 如果我正确理解文档,配置MessageListenerContainer就足够了,例如: @配置 公共类Mykafka配置{ @豆子 公共消息ListenerCo

我已经:

您可以通过配置MessageListenerContainer并提供消息侦听器或使用@KafkaListener注释来接收消息

然而,我不能完全让它工作。我使用的是Spring Boot 2.1.2,而且可能会在春汤中销售过多的豆子,这些豆子对我来说弊大于利,所以我想了解它是如何工作的,这样我就可以检查我偏离荣耀之路的地方了

如果我正确理解文档,配置
MessageListenerContainer
就足够了,例如:

@配置
公共类Mykafka配置{
@豆子
公共消息ListenerContainer myVeryOwnListener(ConsumerFactory ConsumerFactory){
ContainerProperties cProps=新的ContainerProperty(新主题分区初始偏移量(“spring kafka stackoverflow questions”、/*分区*/0、/*偏移量*/0L));
KafkCamessageListenerContainer结果=新的KafkCamessageListenerContainer(consumerFactory,cProps);

result.setupMessageListener(MessageListener该文档的下一节说:

使用消息侦听器容器时,必须提供一个侦听器来接收数据。当前有八个受支持的消息侦听器接口。下面的列表显示了这些接口

下面有一节使用KafkCamessageListenerContainer

要将
MessageListener
分配给容器,您可以在创建容器时使用
ContainerProps.setMessageListener
方法。以下示例说明了如何执行此操作:

ContainerProperties containerProps = new ContainerProperties("topic1", "topic2");
containerProps.setMessageListener(new MessageListener<Integer, String>() {
    ...
});
DefaultKafkaConsumerFactory<Integer, String> cf =
                        new DefaultKafkaConsumerFactory<Integer, String>(consumerProps());
KafkaMessageListenerContainer<Integer, String> container =
                        new KafkaMessageListenerContainer<>(cf, containerProps);
return container;
ContainerProperties containerProps=新的containerproperty(“主题1”、“主题2”);
containerProps.setMessageListener(新MessageListener(){
...
});
默认卡夫卡消费工厂cf=
新的DefaultKafkanConsumerFactory(ConsumerOps());
KafkamessageliesTennerContainer容器=
新的卡夫卡快递集装箱(cf,containerProps);
返回容器;
参考资料开头有一个完整的样本:

@测试
public void testAutoCommit()引发异常{
logger.info(“启动自动”);
ContainerProperties containerProps=新的ContainerProperty(“主题1”、“主题2”);
最终倒计时闩锁=新倒计时闩锁(4);
containerProps.setMessageListener(新MessageListener(){
@凌驾
消息(消费者记录消息)上的公共无效{
logger.info(“接收:+消息”);
倒计时();
}
});
KafkaMessageListenerContainer container=createContainer(containerProps);
容器名称(“testAuto”);
container.start();
Thread.sleep(1000);//等待容器启动
KafkaTemplate=createTemplate();
模板.setDefaultTopic(主题1);
template.sendDefault(0,“foo”);
发送默认值(2,“条”);
template.sendDefault(0,“baz”);
模板。发送默认值(2,“qux”);
template.flush();
assertTrue(闩锁等待(60,时间单位秒));
container.stop();
logger.info(“自动停止”);
}

该文档的下一节说:

使用消息侦听器容器时,必须提供一个侦听器来接收数据。当前有八个受支持的消息侦听器接口。下面的列表显示了这些接口

下面有一节使用KafkCamessageListenerContainer

要将
MessageListener
分配给容器,您可以在创建容器时使用
ContainerProps.setMessageListener
方法。以下示例说明了如何执行此操作:

ContainerProperties containerProps = new ContainerProperties("topic1", "topic2");
containerProps.setMessageListener(new MessageListener<Integer, String>() {
    ...
});
DefaultKafkaConsumerFactory<Integer, String> cf =
                        new DefaultKafkaConsumerFactory<Integer, String>(consumerProps());
KafkaMessageListenerContainer<Integer, String> container =
                        new KafkaMessageListenerContainer<>(cf, containerProps);
return container;
ContainerProperties containerProps=新的containerproperty(“主题1”、“主题2”);
containerProps.setMessageListener(新MessageListener(){
...
});
默认卡夫卡消费工厂cf=
新的DefaultKafkanConsumerFactory(ConsumerOps());
KafkamessageliesTennerContainer容器=
新的卡夫卡快递集装箱(cf,containerProps);
返回容器;
参考资料开头有一个完整的样本:

@测试
public void testAutoCommit()引发异常{
logger.info(“启动自动”);
ContainerProperties containerProps=新的ContainerProperty(“主题1”、“主题2”);
最终倒计时闩锁=新倒计时闩锁(4);
containerProps.setMessageListener(新MessageListener(){
@凌驾
消息(消费者记录消息)上的公共无效{
logger.info(“接收:+消息”);
倒计时();
}
});
KafkaMessageListenerContainer container=createContainer(containerProps);
容器名称(“testAuto”);
container.start();
Thread.sleep(1000);//等待容器启动
KafkaTemplate=createTemplate();
模板.setDefaultTopic(主题1);
template.sendDefault(0,“foo”);
发送默认值(2,“条”);
template.sendDefault(0,“baz”);
模板。发送默认值(2,“qux”);
template.flush();
assertTrue(闩锁等待(60,时间单位秒));
container.stop();
logger.info(“自动停止”);
}

我刚刚将你的bean复制到一个新的启动应用程序中,它运行得很好

端点注册表仅适用于
@KafkaListener
容器,因为它们在应用程序上下文中未注册为bean(注册表就是bean)


@SpringBoot应用程序
公共类SO57628247应用程序{
私有静态final int MessageListener=0;
公共静态void main(字符串[]args){
SpringApplication.run(So57628247Application.class,args);
}
@豆子
公共消息ListenerContainer myVeryOwnListener(ConsumerFactory ConsumerFactory){
ContainerProperty cProps=新的ContainerProperty(新主题分区初始偏移(
“春季卡夫卡问题”