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

问题描述 投票:0回答:1

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

目标:

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

当前设置:

  1. Spring Boot 1.5.6
  2. Apache ZooKeeper 3.4.6
  3. Apache ActiveMQ 5.7
  4. Wicket 7.7.0

迄今为止完成的工作:

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

问题:

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

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

spring activemq wicket apache-zookeeper
1个回答
0
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.