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

时间:2019-05-15 16:11:43

标签: java apache-kafka spring-kafka

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

我想先加载那些数据,所以我使用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"));

有效。

有人知道为什么为容器组获取bean会阻止所有其他侦听器正常工作吗?知道所有其他@KafkaListeners都是由:

定义的
@KafkaListener(topics = "myTopic")

修改

经过进一步调查,该问题与KafkaListenerEndpointRegistry有关。

如果SmartLifeCycle bean是使用“ KafkaListenerEndpointRegistry”作为依赖项创建的,则该应用程序正在运行。即使我根本不使用注册表。

但是,如果在没有此注册表的情况下创建了SmartLifeCycle bean,则应用程序将失败。

1 个答案:

答案 0 :(得分:1)

您需要显示您的容器工厂。

我假设您将autoStartup设置为false,因为您是手动启动它们。

因此其他人也不会开始;由于您希望在加载压缩的主题之后启动它们,因此只需在端点注册表上调用start(),它将启动其他主题。

或者您可以将其他人放在另一个containerGroup中。