`
ahuaxuan
  • 浏览: 640684 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

把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  
博主很棒 语文没有问题 翻译很到位 比我强很多很多了 谢谢博主分享此篇文章 对我有很大帮助

相关推荐

    ActiveMQ整合spring的Demo

    8. **监控与管理**:ActiveMQ提供了Web控制台,可以通过浏览器访问来监控消息代理的状态,查看队列和主题中的消息数量,以及进行管理操作。 9. **扩展到分布式系统**:这个Demo作为一个单项目,但其设计思路可以...

    spring整合Activemq源码

    总结,`spring整合Activemq源码`项目展示了如何在Spring和SpringMVC环境中利用ActiveMQ实现消息的发布与订阅。通过理解这些知识点,开发者能够更好地理解和实践消息队列在实际项目中的应用,提升系统的稳定性和扩展...

    Spring整合ActiveMQ简单实例

    Spring 框架与 ActiveMQ 的整合,使得开发者能够轻松地在 Spring 应用程序中使用消息中间件。本文将详细阐述如何实现这一整合,以及其中涉及的关键知识点。 首先,**ActiveMQ** 是 Apache 开源项目,是基于 Java 的...

    spring整合JMS-居于ActiveMQ实现

    Spring整合JMS基于ActiveMQ实现是一项常见的企业级应用开发任务,它涉及到Spring框架、Java消息服务(JMS)以及ActiveMQ消息中间件的使用。在本文中,我们将深入探讨这三个关键概念,以及如何将它们有效地结合在一起...

    ActiveMQ与Spring整合示例Demo

    **ActiveMQ与Spring整合详解** ...通过这个项目,你可以了解到如何在Spring应用中集成并使用ActiveMQ,以及如何设计消息的生产和消费流程。理解并熟练运用这些知识,对于构建高可用、高性能的企业级应用至关重要。

    activemq 配置说明与activemq入门讲解

    3. **Web控制台**:ActiveMQ内置了一个Web控制台,可以通过浏览器访问`http://localhost:8161/admin`来监控和管理队列、主题、连接和消费者等。 4. **消息模型**:ActiveMQ支持两种消息模型——点对点(Queue)和...

    spring boot activemq整合例子

    此外,ActiveMQ本身也有Web控制台,可以直观查看消息队列、订阅者等信息。 10. **高可用性和集群**:在生产环境中,可能需要配置ActiveMQ集群以提高可用性和扩展性。Spring Boot应用可以透明地连接到这些集群,无需...

    ActiveMQ消息队列主题订阅Spring整合

    可以使用ActiveMQ的Web控制台监控消息队列的状态,查看消息的发送和接收情况。 通过以上步骤,你可以成功地将ActiveMQ消息队列与Spring框架整合,实现基于主题订阅的消息传递。这种整合有助于解耦系统组件,提高...

    activemq与spring整合

    2. **ActiveMQ监控**:利用ActiveMQ的Web控制台监控消息队列的状态,如消息量、消费者状态等。 3. **日志与异常处理**:完善日志记录和异常处理机制,便于排查问题。 总结,ActiveMQ与Spring的整合能够为Java应用...

    activemq-web-3.1.jar.zip

    在集成ActiveMQ Web 3.1到你的项目中,你需要确保满足以下几点: 1. **环境配置**:确保你的开发环境支持Java运行时环境(JRE)和Servlet容器,如Tomcat或Jetty,因为ActiveMQ Web是一个基于Web的应用。 2. **依赖...

    activeMQ整合Spring

    整合 ActiveMQ 和 Spring 可以帮助开发者更方便地在应用程序中使用消息队列,实现解耦、异步处理以及系统间的通信。 一、ActiveMQ 简介 ActiveMQ 是 Apache 软件基金会的一个项目,支持多种协议如 OpenWire、STOMP...

    ActiveMQ整合spring的Demo.zip

    5. **测试与调试**:可以使用ActiveMQ的Web控制台(默认在8161端口)监控队列和主题的状态,查看消息的发送和接收情况。此外,还可以通过修改Spring配置或应用程序代码进行测试和调试。 这个Demo项目将帮助开发者...

    spring配置activemq详解

    - ActiveMQ提供了Web控制台,可以通过浏览器进行监控和管理,查看队列状态、消息统计等信息。 - Spring也提供了健康检查和指标暴露的功能,便于在微服务环境中监控消息系统的运行状况。 总之,"spring配置...

    activeMQ+spring

    同时,ActiveMQ还提供了丰富的监控和管理工具,如Web控制台,便于对消息队列进行管理和监控。 总之,ActiveMQ和Spring的整合是Java企业级应用中常见的一种架构模式,它利用消息队列技术提升了系统的稳定性和可扩展...

    activemq新手大全

    【描述】:这篇教程涵盖了从JMS基础到activemq的深入探讨,包括activemq的安装、特性、使用场景以及与spring的整合,还涉及到了activemq的消息传递、确认机制和持久化机制。 **一、JMS基本概念** JMS(Java ...

    ActiveMQ快速上手 PDF

    - **测试运行**:使用 `bin/activemq console` 进入 ActiveMQ 控制台,或者通过 Web 界面 (`http://localhost:8161/admin`) 来查看运行状态。 - **关闭**:使用 `bin/activemq stop` 命令来停止 ActiveMQ 服务。 ##...

    apache-activemq-5.15.2下的demo

    - 要运行这些示例,你需要先启动ActiveMQ服务器,然后将`webapps-demo`目录部署到ActiveMQ的web容器中,如Tomcat。 - 访问部署后的Web应用,按照界面提示进行操作,即可体验各种功能。 6. **最佳实践**: - 在...

    Spring整合activemq

    4. **监控与管理**: ActiveMQ提供了Web控制台,访问`http://your_server_ip:8161/admin`即可进行管理和监控。 **二、Spring整合ActiveMQ** 1. **添加依赖**: 在Spring项目中,需要在`pom.xml`文件中添加ActiveMQ的...

    activeMQ学习

    6. **灵活性**:ActiveMQ可以作为嵌入式组件直接集成到应用程序中,也可以部署为独立的服务。此外,它支持多种消息模型,如点对点(Point-to-Point)和发布/订阅(Publish/Subscribe)。 7. **跨语言支持**:由于...

    ActiveMQ教程

    这个示例演示了如何使用ActiveMQ连接到服务器,创建一个消息队列,并发送一条文本消息到该队列中。注意代码中创建的`ActiveMQConnectionFactory`对象是ActiveMQ提供的连接工厂实现,用于与ActiveMQ服务器建立连接。 ...

Global site tag (gtag.js) - Google Analytics