我的应用程序正在听几个主题。其中一些是压缩主题,用于在内存中加载某些数据。
我想先加载这些数据,所以我使用SmartLifecycle在其他容器之前手动启动这些容器。
它运行得很好,但是为了简单起见,我尝试使用containerGroup
@KafkaListener(id = "myId", containerGroup = "compacted", ...)然后,在我使用的SmartLifecycle bean中:
Collection<MessageListenerContainer> compactedListenerContainers = applicationContext.getBean("compacted", Collection.class);但是一旦我这样做了,在完成"start“方法之后,其他容器就永远不会启动了。
如果我将这一行改为:
Collection<MessageListenerContainer> compactedListenerContainers = Arrays.asList(registry.getListenerContainer("myId"));起作用了。
知道为什么获取containerGroup的bean会阻止所有其他侦听器工作吗?知道所有其他@KafkaListener都是由以下代码定义的:
@KafkaListener(topics = "myTopic")编辑
经进一步研究,该问题与KafkaListenerEndpointRegistry有关。
如果SmartLifeCycle bean是以"KafkaListenerEndpointRegistry“作为依赖创建的,则应用程序正在工作。即使我根本不使用注册表。
但是,如果SmartLifeCycle bean是在没有此注册表的情况下创建的,则应用程序失败。
发布于 2019-05-15 16:32:14
你需要展示你的集装箱工厂。
我想您已经将autoStartup设置为false,因为您正在手动启动它们。
因此,其他内容也不会启动;因为您希望在加载压缩主题之后启动它们,因此只需在端点注册表上调用start(),它就会启动其他主题。
或者你可以把其他的放到另一个containerGroup中。
https://stackoverflow.com/questions/56153611
复制相似问题