我的应用程序正在侦听几个主题。其中一些是压缩主题,用于将一些数据加载到内存中。
我想先加载这些数据,所以我使用SmartLifecycle在其他容器之前手动启动了那些容器。
效果很好,但为简单起见,我尝试使用containerGroup
@KafkaListener(id = "myId", containerGroup = "compacted", ...)
然后在SmartLifecycle bean中,我使用了:
Collection<MessageListenerContainer> compactedListenerContainers = applicationContext.getBean("compacted", Collection.class);
但是一旦完成,“启动”方法完成后,其他容器将永远不会启动。
如果我将这一行替换为:
Collection<MessageListenerContainer> compactedListenerContainers = Arrays.asList(registry.getListenerContainer("myId"));
它的工作。
知道为什么为容器组获取bean会阻止所有其他侦听器工作吗?知道所有其他@KafkaListeners只是由定义的:
@KafkaListener(topics = "myTopic")
编辑
经过进一步调查,该问题与KafkaListenerEndpointRegistry有关。
如果SmartLifeCycle bean是使用“ KafkaListenerEndpointRegistry”作为依赖项创建的,则该应用程序正在运行。即使我根本不使用注册表。
但是,如果在没有此注册表的情况下创建了SmartLifeCycle bean,则应用程序将失败。
您需要显示您的集装箱工厂。
我猜您已经autoStartup
设置为false,因为您是手动启动它们的。
所以其他人也不会开始。由于您要在加载压缩主题之后启动它们,因此只需调用start()
端点注册表,它将启动其他注册表。
或者,您可以将其他人放在另一个人中containerGroup
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句