当前位置: 代码迷 >> Web前端 >> 把ActiveMQ的控制台调整到你的web程序中
  详细解决方案

把ActiveMQ的控制台调整到你的web程序中

热度:435   发布时间:2012-10-24 14:15:58.0
把ActiveMQ的控制台整合到你的web程序中
在使用ActiveMQ的时候把ActiveMQ的控制台整合到web程序中是比较好的做法,这里有篇文章讲解了这样一个步骤http://www.oreillynet.com/onjava/blog/2007/06/integrating_activemq_web_conso.html 。
原文作者:Dejan Bosanac
译者:张荣华
由于水平所限,翻译难免有不妥之处欢迎大家指正。
?
正文:
如果你的应用程序整合了ActiveMQ,那么再把他的web控制台也整合到你的应用中应该来说是很有意义的。它(ActiveMQ的web控制台)能为你的用户提供基本的监控和管理的操作功能。你可以采取的一个方案是把它做成一个war文件,整合进系统,但是如果你已经在系统中整合了一大堆的ActiveMQ,你可能就只想引进那些必需的库和文件了。
?
事实上,我们并不能做到无缝整合(作者的无缝整合估计是指不需什么配置拿来即用的那种方式)。但是在做这项工作的时候我仍然发现了几个步骤(希望可以帮助有同样需求的人)。我使用maven2来作为构建工具,它会组装那些插件来创建一个最终的distribution。如果你使用一些不同的构建环境,那么最好还是坚持定制war文件。
?
首先,你需要使用version2.2或更新的maven assembly plugin。 然后把以下代码片断复制到你的pox.xml中去:
xml 代码
  1. < build > ??
  2. ???? < plugins > ??
  3. ???????? < plugin > ??
  4. ???????????? < groupId > org.apache.maven.plugins </ groupId > ??
  5. ???????????? < artifactId > maven-assembly-plugin </ artifactId > ??
  6. ???????????? < version > 2.2-beta-1 </ version > ??
  7. ???????????? < configuration > ??
  8. ???????????????? < descriptors > ??
  9. ???????????????????? < descriptor > ??
  10. ????????????????????????src/main/descriptors/unix-bin.xml ??
  11. ???????????????????? </ descriptor > ??
  12. ???????????????? </ descriptors > ??
  13. ???????????????? < finalName > sensatic-jqr-${pom.version} </ finalName > ??
  14. ???????????????? < appendAssemblyId > false </ appendAssemblyId > ??
  15. ???????????? </ configuration > ??
  16. ???????? </ plugin > ??
  17. ???? </ plugins > ??
  18. </ build > ??
?
Version2.2的plugin需要一些额外的war解压缩(这里的解压缩就是指把war包中的内容抽取出来)处理,待会我们就会看到了。
?
现在让我们看看要在部署里面加些什么东西。首先我们需要创建一个依赖集(这里的依赖集其实不应该翻译,因为作者指的是下面这个<dependencySet>节点),用来将war包解压到应用的指定目录下:
xml 代码
  1. < dependencySet > ??
  2. ???? < outputDirectory > /webapps/admin </ outputDirectory > ??
  3. ???????? < outputFileNameMapping > </ outputFileNameMapping > ??
  4. ???????? < unpack > true </ unpack > ??
  5. ???????? < unpackOptions > ??
  6. ???????????? < excludes > ??
  7. ???????????????? < exclude > **/activemq.xml </ exclude > ??
  8. ???????????????? < exclude > **/webconsole-*.xml </ exclude > ??
  9. ???????????????? < exclude > WEB-INF/lib/** </ exclude > ??
  10. ???????????? </ excludes > ??
  11. ???????? </ unpackOptions > ??
  12. ???????? < scope > runtime </ scope > ??
  13. ???????? < includes > ??
  14. ???????????? < include > ?org.apache.activemq:activemq-web-console? </ include > ??
  15. ???????? </ includes > ??
  16. </ dependencySet > ??
  17. ???
这个配置片断中有些部分值得注释一下。正如你看到的那样,我们已经配置了程序来解压缩war文件到/webapps/admin目录。我们需要version2.2的assembly plugin的目的就是使用<unpackOptions>,这个元素允许我们在解压的时候排除war包中某些文件。在上面的配置中,我排除了默认的配置文件,因为待会我将导入我需要的配置文件。同时,我也把WEB-INF/lib目录中的所有jar包都去掉了。正如我前面讲的,大多数的这些jar包已经在classpath下了。那些不在classpath下而且又是我们所需要的包可以用以下代码包含进来:
xml 代码
  1. < dependencySet > ??
  2. ???? < outputDirectory > /webapps/admin/WEB-INF/lib </ outputDirectory > ??
  3. ???????? < scope > runtime </ scope > ??
  4. ???????? < includes > ??
  5. ???????????? < include > opensymphony:sitemesh </ include > ??
  6. ???????????? < include > javax.servlet:jstl </ include > ??
  7. ???????????? < include > org.mortbay.jetty:jsp-2.1 </ include > ??
  8. ???????????? < include > org.mortbay.jetty:jsp-api-2.1 </ include > ??
  9. ???????????? < include > taglibs:standard </ include > ??
  10. ???????????? < include > rome:rome </ include > ??
  11. ???????????? < include > jdom:jdom </ include > ??
  12. ???????? </ includes > ??
  13. </ dependencySet > ??
?
我的应用程序是用jetty启动的, 这意味着所有需要的jar包已经在应用的classpath下了,所以这里,我们只需要包含这个特殊的web应用所需要的jar包就可以了。同时在做这项工作的同时我也发现了一些有趣的事:
??? 1 当上面所说的一些jar包不是直接放在ActiveMQ的web控制台项目的classpath下(但是却放在父应用的classpath下),Web控制台会抛出异常(不能发现资源,如TLD)。我还不确定原因,但是我猜这是一个类加载方面的问题。 在这种情况下,我需要明确的把它放到web应用的classpath下,我并没有去深入的研究这个问题。
?
??? 2 如果web控制台是用它本身的classpath中的ActiveMQ,它会抛一个异常来定位嵌入的broker。这里有三种解决方案,一个把所有的ActiveMQ的jar包从WEB-INF/lib下移除(我们用这种),设置父应用的classloader的优先级(后面将会讨论这个方法),或者使用其他的机制来配置web控制台。
?
在我们设置好classpath之后,就是时候来正确的配置我的web控制台了。默认情况下,web控制台会去加载webconsol-embedded.xml,并且会开启一个broker并使用这个broker。因为我们已经有了我们自己的broker,那么这个新开启的多余我们来说就是多余的了。所以我们需要提供我们自己的“轻量级”的配置:
xml 代码
  1. <!DOCTYPE?beans?PUBLIC?"-//SPRING//DTD?BEAN//EN" ??
  2. ????"http://www.springframework.org/dtd/spring-beans.dtd" > ??
  3. < beans > ??
  4. ? ??
  5. ? < bean ? id = "placeholderConfig" ??
  6. ?????? class = "org.springframework.beans.factory.config.PropertyPlaceholderConfigurer" ? /> ??
  7. ? ??
  8. ? <!--?use?the?following?bean?for?a?local?in-JVM?broker?--> ??
  9. ? < bean ? id = "brokerQuery" ??
  10. ?????? class = "org.apache.activemq.web.SingletonBrokerFacade" ??
  11. ?????? autowire = 'constructor' ? singleton = "false" /> ??
  12. ? ??
  13. ? < bean ? id = "sessionPool" ??
  14. ?????? class = "org.apache.activemq.web.SessionPool" > ??
  15. ???????? < property ? name = "connectionFactory" ? ref = "connectionFactory" /> ??
  16. ? </ bean > ??
  17. ? ??
  18. ? < bean ? id = "connectionFactory" ? class = "org.apache.activemq.ActiveMQConnectionFactory" > ??
  19. ??? < property ? name = "brokerURL" ? value = "vm://localhost" /> ??
  20. ? </ bean > ??
  21. ? ??
  22. ? < bean ? id = "queueBrowser" ??
  23. ?????? class = "org.apache.activemq.web.QueueBrowseQuery" ??
  24. ?????? autowire = 'constructor' ? singleton = "false" /> ??
  25. ? < bean ? id = "messageQuery" ??
  26. ?????? class = "org.apache.activemq.web.MessageQuery" ??
  27. ?????? autowire = 'constructor' ? singleton = "false" /> ??
  28. ? ??
  29. </ beans > ??
?
最后唯一剩下需要做的就是配置我们的web应用程序了。如果你没有配置jetty,那么首先你需要配置一下它。剩下的你需要做的就是提供额外的web应用程序的配置了,如下:
xml 代码
  1. < bean ? class = "org.mortbay.jetty.webapp.WebAppContext" > ??
  2. ???? < property ? name = "contextPath" ? value = "/admin" /> ??
  3. ???? < property ? name = "resourceBase" ? value = "webapps/admin" /> ??
  4. ???? < property ? name = "parentLoaderPriority" ? value = "false" /> ??
  5. </ bean > ??
?
如果你使用spring,也可以这样配置:
xml 代码
  1. < webAppContext ? contextPath = "/admin" ??
  2. resourceBase = "webapps/admin" ? parentLoaderPriority = "false" ? /> ??
?
parentLoaderPriority属性的作用是告诉jetty是加载父应用的类还是本应用的类(如果两个应用有重复的类的话)。从我观察到的情况来看,在父应用的类优先级高的情况下,如果 web控制台需要老版本的jar包,那将会提高问题的发生概率,所以我把这个属性设为false。
?
以后,我想把这些jar包从WEB-INF/lib移到一个公用的目录,所有的web应用都可以共享它。
?
最后,如果你能从库(repository,指版本控制器的repository)中下载压缩版本(没有所需的jar文件,但是有现成的配置文件)的话那就太好了,解压之后嵌入到父应用中,那这个过程就变得轻而易举了。
译文结束
?
按照apache的说法,ActiveMQ的下一个版本5.0将默认自带web控制台,那么上面这些麻烦的步骤就可以省去了,但如果用5.0之前的版本的话,这篇文章可以作为一个参考。由于本人的语文水平问题,文章中不免有很多语句有不通顺,希望大家能多多拍砖。
?
?
1 楼 ssy341 2012-05-09  
博主很棒 语文没有问题 翻译很到位 比我强很多很多了 谢谢博主分享此篇文章 对我有很大帮助
  相关解决方案