Java 为什么使用containerGroup会阻止我的其他侦听器工作?
我的应用程序正在收听几个主题。 其中一些是压缩主题,用于在内存中加载一些数据 我想先加载这些数据,所以我使用SmartLifecycle在其他容器之前手动启动这些容器 它工作得很好,但为了简单起见,我尝试使用containerGroupJava 为什么使用containerGroup会阻止我的其他侦听器工作?,java,apache-kafka,spring-kafka,Java,Apache Kafka,Spring Kafka,我的应用程序正在收听几个主题。 其中一些是压缩主题,用于在内存中加载一些数据 我想先加载这些数据,所以我使用SmartLifecycle在其他容器之前手动启动这些容器 它工作得很好,但为了简单起见,我尝试使用containerGroup @KafkaListener(id = "myId", containerGroup = "compacted", ...) 然后在我使用的SmartLifecycle bean中: Collection<MessageListenerC
@KafkaListener(id = "myId", containerGroup = "compacted", ...)
然后在我使用的SmartLifecycle bean中:
Collection<MessageListenerContainer> compactedListenerContainers = applicationContext.getBean("compacted", Collection.class);
编辑
经过进一步调查,该问题与卡夫卡登记处有关
如果SmartLifeCycle bean是以“KafkaListenerEndpointRegistry”作为依赖项创建的,则应用程序正在工作。即使我根本不使用注册表
但是,如果创建的SmartLifeCycle bean没有此注册表,则应用程序将失败。您需要显示您的容器工厂 我假定您已将
autoStartup
设置为false,因为您正在手动启动它们
所以其他人也不会开始;由于要在加载压缩主题后启动它们,只需在端点注册表上调用start()
,它就会启动其他主题
或者您可以将其他工厂放入另一个
containerGroup
我明天会更新工厂。但是有两个不同的工厂,一个是AutoStart,另一个不是。但对我来说,这里的关键是,通过交换这两行代码,行为会发生变化。为什么?我只是得到了不同的容器,不是与它们相互作用,也不是特别是与阻塞的容器相互作用;但是我很困惑;我以为你不希望其他容器在你的压缩原木被装载之前启动。也许一个小的示例应用程序可以帮助我了解你在做什么。你有时间发现什么吗?对不起,我上周没有机会看这个。这是因为如果注册的容器正在运行,注册表将从isRunning()
返回true
。我没有写那段代码,所以我不确定预期的逻辑是什么。在下一个版本中,我将更改注册表,使其具有自己的生命周期状态;同时,您可以调用registry.getListenerContainers().foreach(c->c.start())
。哦,好吧,但是为什么在我的bean创建中使用注册表作为参数很重要呢?因为在我的示例中,添加/删除它会改变行为。您的建议是在mySmartLifeCycle
bean中的mystart()
方法的末尾添加registry.getListenerContainers().foreach(c->c.start())
?
Collection<MessageListenerContainer> compactedListenerContainers = Arrays.asList(registry.getListenerContainer("myId"));
@KafkaListener(topics = "myTopic")