做ActiveMQ的简单实例时遇到的奇怪问题

环境:ActiveMQ 5.7,Tomcat6,JDK1.6

消息接收者的代码基本抄袭自:

http://wenku.baidu.com/view/1cab03d380eb6294dd886cbc.html


虽然正常来说web-console和消息接收者不会部署在同一容器下,但遇到这样的问题总是想搞清楚原因。


今天在调试时遇到了奇怪的问题,最后发现是部署在同一Tomcat下的ActiveMQ web-console和receiver能当两个应用之间虽然应当没有直接的依赖关系(即使没有ActiveMQ web-console也不影响客户端执行的),但如果receiver早于ActiveMQ web-console启动,receiver的监听器就会失效,把启动顺序倒换过来执行就OK了。




分析后,确认是receiver应用的监听器与web-console应用的监听器发生了某种交互,把web-console的web.xml里关于监听器的部分注释掉后接收者的监听器便工作正常。

 <listener>

   <listener-class>org.apache.activemq.web.WebConsoleStarter</listener-class>

 </listener>


然后继续在WebConsoleStarter类里查找,确认是createWebapplicationContext(ServletContext servletContext)方法的以下代码的缘故:

       XmlWebApplicationContext context = new XmlWebApplicationContext();

       context.setServletContext(servletContext);

       context.setConfigLocations(new String[] {

           configuration

       });

       context.refresh();

       context.start();


怀疑是以上代码令先启动的receiver的监听器失去作用,有可能是这段代码重置了receiver到ActiveMQ服务器的监听连接,但这只是我主观的猜测,项目工期紧没时间研究下去了。


2013.07.19编辑

今天确认Active Web Console部署到Tomcat下时本身也是一个JMS的服务器,之前的问题就清晰了。当receiver先于Tomcat ActiveMQ Web启动时,消息接收者的监听器连接的是ActiveMQ jetty服务器,随后Tomcat ActiveMQ Web启动,ActiveMQ jetty服务器被覆盖,监听连接自然失效。

而当Tomcat ActiveMQ Web没有启动时,receiver的监听始终连接的是ActiveMQ jetty服务器;

Tomcat ActiveMQ Web没有启动时早于消息接收者启动时,receiver的监听便直接连到了Tomcat ActiveMQ Web


因为这个问题对Tomcat的应用启动顺序有了兴趣。在网上找到这样一篇文章,对Tomcat6应当也有参考价值。

http://quantum.blog.51cto.com/3633234/1251569

本文出自 “赞否两论-量子” 博客,谢绝转载!

你可能感兴趣的:(spring,tomcat,activemq)