在应用程序启动和关闭时管理 JMS 消息容器



目前,我们有四个在应用程序启动期间启动的 JMS 侦听器容器。它们都通过Apache ZooKeeper连接并手动启动。当无法建立与ZooKeeper的连接时,这就会出现问题。(Wicket) 应用程序无法启动,即使 JMS 侦听器不必处于活动状态即可使用该应用程序。他们只需要在后台收听消息,保存它们,cron 作业就会批量处理它们。

目标

  1. 允许应用程序启动,并且不会因消息容器无法连接而阻止。
  2. 应用程序启动后,启动消息侦听器。
  3. 如果与一个或任何消息侦听器的连接断开,则应尝试自动重新连接。
  4. 在应用程序关闭(例如 Tomcat 关闭)时,应用程序应停止消息侦听器和处理已保存消息的 cron 作业。
  5. 使所有这些可测试(例如,能够为此设置编写集成测试)。

当前设置

  1. 春季启动 1.5.6
  2. Apache ZooKeeper 3.4.6
  3. Apache ActiveMQ 5.7
  4. 检票口 7.7.0

到目前为止所做的工作

  1. 定义一个实现ApplicationListener<ApplicationReadyEvent>的类。
  2. DefaultMessageListenerContainerautoStart属性设置为 false,并在单独的线程中启动onApplicationEvent中的每个容器。

问题

  1. 是否有必要在自己的线程中启动每个消息容器?这似乎是矫枉过正,但"启动"过程的工作方式是为该侦听器构建的,然后启动它。如果需要,用户可以使用一个 UI 组件来启动/停止消息侦听器,如果这些侦听器在一个线程中按顺序启动,则后三个消息容器可能为 null,如果第一个消息容器在启动时尚未连接。
  2. 如何实现目标 4 和 5?

当然,任何关于我是否走在正确轨道上的赞扬都会有所帮助。

如果不在自定义线程中启动它们,则无法完全启动整个应用程序。不仅仅是 Wicket,而且 Servlet 容器不会因为对 ZooKeeper 的阻塞请求而将应用程序状态从 START 更改为 START。

另一种选择是对 ZooKeeper 使用非阻塞请求,但这是由 JMS 客户端 (ActiveMQ) 完成的,因此您需要检查他们的文档(ActiveMQ 和 ZooKeeper)是否支持此功能。我已经好几年没有用过这些了,所以我不能帮你更多。

最新更新