在应用程序启动和关闭时管理 JMS 消息容器
Managing JMS Message Containers on Application Startup and Shutdown
目前,我们有四个在应用程序启动期间启动的 JMS 侦听器容器。它们都通过 Apache ZooKeeper 连接并手动启动。当无法建立与 ZooKeeper 的连接时,这就会成为问题。 (Wicket) 应用程序无法启动,即使 JMS 侦听器不需要处于活动状态也可以使用该应用程序。他们只需要在后台收听消息,保存它们,cron 作业将分批处理它们。
目标:
- 允许应用程序启动并且不会被无法连接的消息容器阻止。
- 应用程序启动后,启动消息侦听器。
- 如果与一个或任何消息侦听器的连接断开,它应该尝试自动重新连接。
- 在应用程序关闭时(例如 Tomcat 正在关闭),应用程序应停止消息侦听器和处理已保存消息的 cron 作业。
- 使所有这些都可测试(例如,能够为此设置编写集成测试)。
当前设置:
- Spring 引导 1.5.6
- Apache 动物园管理员 3.4.6
- 阿帕奇 ActiveMQ 5.7
- 检票口 7.7.0
到目前为止完成的工作:
- 定义实现
ApplicationListener<ApplicationReadyEvent>
. 的 class
- 将
DefaultMessageListenerContainer
的 autoStart
属性 设置为 false,并在单独的线程中启动 onApplicationEvent
中的每个容器。
问题:
- 是否有必要在自己的线程中启动每个消息容器?这似乎有点矫枉过正,但 "start" 进程的工作方式是为该侦听器构建 DefaultMessageListenerContainer,然后启动它。如果需要,用户可以使用 UI 组件来 start/stop 消息侦听器,如果它们在一个线程中顺序启动,那么后三个消息容器可以为空,如果第一个尚未在启动时连接。
- 我如何完成目标 4 和 5?
当然,任何关于我是否在正确轨道上的评论都会有所帮助。
如果不在自定义线程中启动它们,则整个应用程序无法完全启动。不仅仅是Wicket,Servlet容器也不会因为对ZooKeeper的阻塞请求而将应用程序状态从STARTING变为STARTED。
另一种选择是对 ZooKeeper 使用非阻塞请求,但这是由 JMS 客户端 (ActiveMQ) 完成的,因此您需要检查他们的文档(ActiveMQ 和 ZooKeeper)是否支持此操作。好几年没用了,帮不了你了。
目前,我们有四个在应用程序启动期间启动的 JMS 侦听器容器。它们都通过 Apache ZooKeeper 连接并手动启动。当无法建立与 ZooKeeper 的连接时,这就会成为问题。 (Wicket) 应用程序无法启动,即使 JMS 侦听器不需要处于活动状态也可以使用该应用程序。他们只需要在后台收听消息,保存它们,cron 作业将分批处理它们。
目标:
- 允许应用程序启动并且不会被无法连接的消息容器阻止。
- 应用程序启动后,启动消息侦听器。
- 如果与一个或任何消息侦听器的连接断开,它应该尝试自动重新连接。
- 在应用程序关闭时(例如 Tomcat 正在关闭),应用程序应停止消息侦听器和处理已保存消息的 cron 作业。
- 使所有这些都可测试(例如,能够为此设置编写集成测试)。
当前设置:
- Spring 引导 1.5.6
- Apache 动物园管理员 3.4.6
- 阿帕奇 ActiveMQ 5.7
- 检票口 7.7.0
到目前为止完成的工作:
- 定义实现
ApplicationListener<ApplicationReadyEvent>
. 的 class
- 将
DefaultMessageListenerContainer
的autoStart
属性 设置为 false,并在单独的线程中启动onApplicationEvent
中的每个容器。
问题:
- 是否有必要在自己的线程中启动每个消息容器?这似乎有点矫枉过正,但 "start" 进程的工作方式是为该侦听器构建 DefaultMessageListenerContainer,然后启动它。如果需要,用户可以使用 UI 组件来 start/stop 消息侦听器,如果它们在一个线程中顺序启动,那么后三个消息容器可以为空,如果第一个尚未在启动时连接。
- 我如何完成目标 4 和 5?
当然,任何关于我是否在正确轨道上的评论都会有所帮助。
如果不在自定义线程中启动它们,则整个应用程序无法完全启动。不仅仅是Wicket,Servlet容器也不会因为对ZooKeeper的阻塞请求而将应用程序状态从STARTING变为STARTED。
另一种选择是对 ZooKeeper 使用非阻塞请求,但这是由 JMS 客户端 (ActiveMQ) 完成的,因此您需要检查他们的文档(ActiveMQ 和 ZooKeeper)是否支持此操作。好几年没用了,帮不了你了。