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