Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么使用containerGroup会阻止我的其他侦听器工作?_Java_Apache Kafka_Spring Kafka - Fatal编程技术网

Java 为什么使用containerGroup会阻止我的其他侦听器工作?

Java 为什么使用containerGroup会阻止我的其他侦听器工作?,java,apache-kafka,spring-kafka,Java,Apache Kafka,Spring Kafka,我的应用程序正在收听几个主题。 其中一些是压缩主题,用于在内存中加载一些数据 我想先加载这些数据,所以我使用SmartLifecycle在其他容器之前手动启动这些容器 它工作得很好,但为了简单起见,我尝试使用containerGroup @KafkaListener(id = "myId", containerGroup = "compacted", ...) 然后在我使用的SmartLifecycle bean中: Collection<MessageListenerC

我的应用程序正在收听几个主题。 其中一些是压缩主题,用于在内存中加载一些数据

我想先加载这些数据,所以我使用SmartLifecycle在其他容器之前手动启动这些容器

它工作得很好,但为了简单起见,我尝试使用containerGroup

@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创建中使用注册表作为参数很重要呢?因为在我的示例中,添加/删除它会改变行为。您的建议是在my
SmartLifeCycle
bean中的my
start()
方法的末尾添加
registry.getListenerContainers().foreach(c->c.start())
Collection<MessageListenerContainer> compactedListenerContainers = Arrays.asList(registry.getListenerContainer("myId"));
@KafkaListener(topics = "myTopic")