我有一个场景,在应用程序运行时通过
IntegrationFlowContext
创建多个集成流(例如,监听 JMS 队列)并且它工作正常(SpringBoot 3.4.0),但是我们注意到以下情况:
我们当前的实现在带有
@PostConstruct
注释的方法中进行集成流注册。问题是:当启动应用程序并且 JMS 队列中有挂起的消息时,动态创建的流将开始按预期处理它们,但如果在处理过程中出现任何错误(例如,RuntimeException
),则不会调用默认错误处理因此没有日志并且失败消息丢失 - 我正在 JMS 适配器中设置 errorChannel
(也在 DEBUG
模式下检查)。看起来错误处理流程在应用程序启动期间尚未准备好(生命周期?)。
请注意,如果应用程序已启动并正在运行,并且我们将相同的消息推送到队列中,则默认错误处理流程工作得很好。
我们找到了使用
@EventListener(ApplicationReadyEvent.class)
Spring 注解而不是 @PostConstruct
的解决方案。但这是正确的做法吗?为什么 @PostConstruct
方法在这种情况下不起作用?
确实,现在开始处理数据还为时过早。 那(自动启动)必须推迟到
@PostConstruct
的后期。我们甚至在文档中提到这一点:https://docs.spring.io/spring-integration/reference/overview.html#programming-considerations。 那就
ApplicationContext
是正确的选择。至少现在是这样。
我们可能会研究@EventListener(ApplicationReadyEvent.class)
的改进,以在
IntegrationFlowContext
尚未准备就绪时延迟启动那些动态添加的流。随时为 Spring Integration 项目提出 GH 问题。