java - 为什么使用 containerGroup 会阻止我的其他侦听器工作?
问题描述
我的应用程序正在收听几个主题。其中一些是压缩主题,用于在内存中加载一些数据。
我想先加载这些数据,所以我使用 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"));
它的工作。
知道为什么为 containerGroup 获取 bean 会阻止所有其他侦听器工作吗?知道所有其他 @KafkaListeners 只是由以下定义:
@KafkaListener(topics = "myTopic")
编辑
经过进一步排查,问题与KafkaListenerEndpointRegistry有关。
如果 SmartLifeCycle bean 是使用“KafkaListenerEndpointRegistry”作为依赖项创建的,则应用程序正在运行。即使我根本不使用注册表。
但是,如果 SmartLifeCycle bean 是在没有此注册表的情况下创建的,则应用程序将失败。
解决方案
您需要展示您的容器工厂。
我认为您已autoStartup
设置为 false,因为您是手动启动它们。
所以其他人也不会开始;由于您想在加载压缩主题后启动它们,只需调用start()
端点注册表,它将启动其他主题。
或者你可以把其他人放在另一个containerGroup
。
推荐阅读
- android - 如何使我的布局在所有 Android 设备中看起来都相似?
- node.js - Nodejs 客户端和 Letsencrypt CA 将于 2021 年 9 月 30 日到期 - nodeJS 客户端明天会中断吗?
- html - 如何在列表中生成动态 url?
- html - 关闭外观后如何在 Safari 中的选择中显示插入符号?
- php - 如何使用具有参数和其他功能的 WooCommerce 钩子?
- javascript - Firebase v8 - 当`firebase.default.auth`未定义时如何访问EmailAuthProvider
- powershell - 执行时的 Powershell 和 XAML 复选框问题
- python - 在新行中返回用户定义对象列表中的每个字符串表示形式
- assembly - THUMB 或 ARM 模式下的动态汇编
- python - 尝试在 matplotlib 中绘制蜘蛛网图的错误结果