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

时间:2019-03-25 16:26:39

标签: spring activemq wicket apache-zookeeper

当前,我们有四个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. autoStart的{​​{1}}属性设置为false,并在单独的线程中启动DefaultMessageListenerContainer中的每个容器。

问题

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

当然,对我是否走上正确道路的任何评论都会有所帮助。

1 个答案:

答案 0 :(得分:0)

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

另一种选择是使用对ZooKeeper的非阻塞请求,但这是由JMS客户端(ActiveMQ)完成的,因此您需要检查其文档(ActiveMQ和ZooKeeper)是否都支持此请求。几年来我都没有用过这些,所以我不能为您提供更多帮助。