问题描述
我正在使用spring提供的@kafkaListener注释来创建kafka容器
@KafkaListener(topics = "#",group = "#",containerFactory = "myContainerFactory")
public void listen(final ConsumerRecord<?,?> message,Acknowledgment ack) {
有什么办法可以获取@kafkaListener批注在后台创建的ConcurrentMessageListenerContainer的句柄吗?我想以编程方式启动/停止容器,这是我的最终目标。 预先感谢
解决方法
@KafkaListener生命周期管理
为@KafkaListener注释创建的侦听器容器不是应用程序上下文中的bean。而是使用类型为KafkaListenerEndpointRegistry的基础结构bean注册它们。该bean由框架自动声明,并管理容器的生命周期。它将自动启动任何将autoStartup设置为true的容器。所有容器工厂创建的所有容器必须处于同一阶段。有关更多信息,请参见侦听器容器自动启动。您可以使用注册表以编程方式管理生命周期。启动或停止注册表将启动或停止所有已注册的容器。或者,您可以使用单个容器的id属性获得对单个容器的引用。您可以在注释上设置autoStartup,它会覆盖在容器工厂中配置的默认设置。您可以从应用程序上下文中获取对该bean的引用,例如自动装配,以管理其注册的容器。以下示例显示了如何执行此操作:
@KafkaListener(id = "myContainer",topics = "myTopic",autoStartup = "false")
public void listen(...) { ... }
@Autowired
private KafkaListenerEndpointRegistry registry;
...
this.registry.getListenerContainer("myContainer").start();
...