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

Managing JMS Message Containers on Application Startup and Shutdown

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

目标

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

当前设置:

  1. Spring 引导 1.5.6
  2. Apache 动物园管理员 3.4.6
  3. 阿帕奇 ActiveMQ 5.7
  4. 检票口 7.7.0

到目前为止完成的工作:

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

问题:

  1. 是否有必要在自己的线程中启动每个消息容器?这似乎有点矫枉过正,但 "start" 进程的工作方式是为该侦听器构建 DefaultMessageListenerContainer,然后启动它。如果需要,用户可以使用 UI 组件来 start/stop 消息侦听器,如果它们在一个线程中顺序启动,那么后三个消息容器可以为空,如果第一个尚未在启动时连接。
  2. 我如何完成目标 4 和 5?

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

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

另一种选择是对 ZooKeeper 使用非阻塞请求,但这是由 JMS 客户端 (ActiveMQ) 完成的,因此您需要检查他们的文档(ActiveMQ 和 ZooKeeper)是否支持此操作。好几年没用了,帮不了你了。