ActiveMQ-inAction-Broker-学习笔记

Running Broker(运行 broker)java

  • ActiveMQ5.0 的二进制发布包中bin 目录中包含一个名为activemq 的脚本,
    • 直接运行这个脚本就能够启动一个broker。
  • 此外也能够经过一下对其进行配置:
    • Broker Configuration URI
    • Broker XBean URI 对broker
  • 如下是一些命令行参数的例子:

Embedded(嵌入的) Brokerweb

  • 能够经过在应用程序中以编码的方式启动broker,例如:
    • Java 代码
      • BrokerService broker = new BrokerService();
        broker.addConnector("tcp://localhost:61616");
        broker.start();

         

  • 启动多个broker,那么须要为broker 设置一个名字。例如:
    • Java 代码
      • BrokerService broker = new BrokerService();
         broker.setName("fred");
         broker.addConnector("tcp://localhost:61616");
         broker.start();
    • 若是但愿在同一个JVM 内访问这个broker,
      • 那么可使用VM Transport,
      • URI是:vm://brokerName。

能够经过BrokerFactory 来建立broker,例如:apache

  • Java 代码
    • BrokerService broker = BrokerFactory.createBroker(new URI(someURI));
      someURI 的可选值以下:
  • 当使用XBean 的配置方式的时候,须要指定一个xml 配置文件,例如:
    • Java 代码
      • BrokerService broker = BrokerFactory.createBroker(new URI("xbean:com/test/activemq.xml"));

         

    • 使用Spring 的配置方式以下:
      • Xml 代码
        • <bean id="broker" class="org.apache.activemq.xbean.BrokerFactoryBean">
               <property name="config" value="classpath:org/apache/activemq/xbean/activemq.xml" />
               <property name="start" value="true" />
           </bean>

           

Monitoring Broker(监控broker)json

  • JMX
    • 在使用JMX 监控broker 以前,
      • 首先要启用broker 的JMX 监控功能,
        • 例如在配置文件中设置useJmx="true",
    • 以下:
      • <broker useJmx="true" brokerName="broker1>
            <managementContext>
                  <managementContext createConnector="true"/>
            </managementContext>
         ...
        </broker>
    • 接下来运行JDK 自带的jconsole。
    • 在运行了jconsole 后,它会弹出对话框来选择须要链接到的agent。
    • 若是是在启动broker 的主机上 运行jconsole,
      • 那么ActiveMQ broker 会出如今jconsole 的Local 标签中。
    • 若是要链接到远程的broker,
      • 那么能够在Advanced 标签中指定JMX URL,
    • 如下是一个链接到本机的JMX URL:
      • service:jmx:rmi:///jndi/rmi://localhost:1099/jmxrmi
    • 在jconsole 的MBeans 标签中,
      • 能够查看详细信息,
      • 也能够执行相应的operation。
    • 须要注意的是,在jconsole 链接到broker 的时候,
      • 并不须要输入用户名和密码,
      • 若是这存在潜在的安全问题,
      • 那么就须要为JMX Connector 配置密码保护(须要使用1.5 以上版本的JDK)。
  • 首先要禁止ActiveMQ 建立本身的connector,例如:
    • Xml 代码
      • <broker xmlns="http://activemq.org/config/1.0" brokerName="localhost" useJmx="true">
            <managementContext>
               <managementContext createConnector="false"/>
            </managementContext>
         </broker>
  • 而后在ActiveMQ 的conf 目录下建立一个访问控制文件和密码文件,
    • 以下:conf/jmx.access:
      • # The "monitorRole" role has readonly access.
        # The "controlRole" role has readwrite access.
        monitorRole readonly
        controlRole readwrite
        conf/jmx.password:
        # The "monitorRole" role has password "abc123".
        # The "controlRole" role has password "abcd1234".
        monitorRole abc123
        
        controlRole abcd1234

         

  • 而后修改ActiveMQ 的bin 目录下activemq 的启动脚本,
    • 查找包含"SUNJMX="的一行以下:
      • REM set SUNJMX=-Dcom.sun.management.jmxremote.port=1616
        -Dcom.sun.management.jmxremote.authenticate=false
        -Dcom.sun.management.jmxremote.ssl=false
      • 把它替换成:
      • set SUNJMX=-Dcom.sun.management.jmxremote.port=1616
        -Dcom.sun.management.jmxremote.authenticate=true
        -Dcom.sun.management.jmxremote.ssl=false
        -Dcom.sun.management.jmxremote.password.file=%ACTIVEMQ_BASE%/conf/jmx.password
        -Dcom.sun.management.jmxremote.access.file=%ACTIVEMQ_BASE%/conf/jmx.access
  • 最后重启ActiveMQ 和jconsole,这时候须要强制login。
    • 若是在启动activemq的过程当中出现如下错误,
      • 那么须要为这个文件增长访问 控制。

Monitoring Broker安全

  • Web Console
    • Web Console 被集成到了ActiveMQ 的二进制发布包中,
      • 所以缺省访问
        • http://localhost:8161/admin
      • 便可访问Web Console。
    • 在配置文件中,
      • 能够经过修改nioConnector 的port 属性
      • 来修改Web console的缺省端口:
        • <jetty xmlns="http://mortbay.com/schemas/jetty/1.0">
             <connectors>
               <nioConnector port="8161" />
             </connectors>
            ...
          </jetty>
    • 出于安全性或者可靠性的考虑,
      • Web Console 能够被部署到不一样于ActiveMQ的进程中。
      • 例如把activemq-web-console.war 部署到一个单独的web 容器中(Tomcat,Jetty 等)。
    • 在ActiveMQ5.0 的二进制发布包中不包含activemq-web-console.war,
      • 所以须要下载 ActiveMQ 的源码,
      • 而后进入到${activemq.base}/src/activemq-web-console 目录中执行mvn instanll。
      • 若是一切正常,
        • 那么缺省会在${activemq.base}/src/activemq-web-console/target目录 中生成activemq-web-console-5.0.0.war。
      • 而后将activemq-web-console-5.0.0.war 拷贝到 Tomcat 的webapps 目录中,并重命名成activemq-web-console.war。
  • 须要注意的是,
    • 要将activemq-all-5.0.0.jar 拷贝到WEB-INF\lib 目录中(可能还须要拷贝jms.jar)。
    • 还要为 Tomcat 设置如下五个系统属性(修改catalina.bat 文件):
      • set JAVA_OPTS=%JAVA_OPTS% -Dwebconsole.type="properties"
        set JAVA_OPTS=%JAVA_OPTS% -Dwebconsole.jms.url="tcp://localhost:61616"
        set JAVA_OPTS=%JAVA_OPTS% -Dwebconsole.jmx.url="service:jmx:rmi:///jndi/rmi://localhost:1099/jmxrmi"
        set JAVA_OPTS=%JAVA_OPTS% -Dwebconsole.jmx.role=""
        set JAVA_OPTS=%JAVA_OPTS% -Dwebconsole.jmx.password=""
      • 若是JMX 没有配置密码保护,
        • 那么webconsole.jmx.role 和webconsole.jmx.password 设置成""便可。
      • 若是 broker 被配置成了Master/Slave 模式,
        • 那么能够配置成使用failover transport,
        • 例如:-Dwebconsole.jms.url=failover:(tcp://serverA:61616,tcp://serverB:61616)
    • 顺便说一下,因为webconsole.type 属性是properties,
      • 所以实际上起做用的Web Console 的配置文件是
        • WEB-INF/ webconsole-properties.xml。
      • 最后启动被监控的ActiveMQ,
        • 访问http://localhost:8080 /activemq-web-console/,
        • 查看显示是否正常。
  • Advisory(咨询的) Message
    • ActiveMQ 支持Advisory Messages,
      • 它容许你经过标准的JMS 消息来监控系统
    • 目前的Advisory Messages 支持:
      •  consumers, producers and connections starting and stopping
         temporary destinations being created and destroyed
         messages expiring on topics and queues
         brokers sending messages to destinations with no consumers.
         connections starting and stopping
    • Advisory Messages 能够被想象成某种的管理通道,
      • 经过它你能够获得关于JMS provider、producers、consumers 和destinations 的信息。
      • Advisory topics都使用ActiveMQ.Advisory.这个前缀,
    • 如下是目前支持的topics:
      • Client based advisories
      • 在消费者启动/中止的Advisory Messages 的消息头中有个consumerCount属性,
        • 他用来指明目前desination 上活跃的consumer 的数量。
      • Destination and Message based advisories
      • 以上的这些destnations 均可以用来做为前缀,
        • 在其后面追加其它的重要信息,
        • 例如topic、queue、clientID、 producderID 和consumerID 等。
      • 这令你能够利用Wildcards 和 Selectors 来过滤Advisory Messages
        • (关于Wildcard和Selector 会在稍后介绍)。
    • 例如,
      • 若是你但愿订阅FOO.BAR 这个queue 上Consumer 的start/stop 的消息,
        • 那么能够订阅 ActiveMQ.Advisory.Consumer.Queue.FOO.BAR;
      • 若是但愿订阅全部queue 上的start/stop 消息,
        • 那么能够订阅ActiveMQ.Advisory.Consumer.Queue.>;
      • 若是但愿订阅全部queue 或者topic上的 start/stop 消息,
        • 那么能够订阅ActiveMQ.Advisory.Consumer. >。
    • org.apache.activemq.advisory.AdvisorySupport 类上有以下的helpermethods,
      • 用来在程序中获得advisory destination objects。
        • Java 代码
          • AdvisorySupport.getConsumerAdvisoryTopic()
            AdvisorySupport.getProducerAdvisoryTopic()
            AdvisorySupport.getDestinationAdvisoryTopic()
            AdvisorySupport.getExpiredTopicMessageAdvisoryTopic()
            AdvisorySupport.getExpiredQueueMessageAdvisoryTopic()
            AdvisorySupport.getNoTopicConsumersAdvisoryTopic()
            AdvisorySupport.getNoQueueConsumersAdvisoryTopic()

             

    • 如下是段使用Advisory Messages 的程序代码:
      • Destination advisoryDestination = AdvisorySupport.getProducerAdvisoryTopic(destination)
        
        	MessageConsumer consumer = session.createConsumer(advisoryDestination);
            consumer.setMessageListener(this);
        
        	// ...
        	public void onMessage(Message msg) {
        		if (msg instanceof ActiveMQMessage) {
        			try {
        				ActiveMQMessage aMsg = (ActiveMQMessage) msg;
        				ProducerInfo prod = (ProducerInfo) aMsg.getDataStructure();
        			} catch (JMSException e) {
        				log.error("Failed to process message: " + msg);
        			}
        		}
        	}
  • Command Agent
    • 在介绍Command Agent 前首先简要介绍一下XMPP(Jabber)协议,
    • XMPP 是一种基于XML 的即时通讯协议
    • 它由Jabber 软件基金会开发。
    • 在配置文件中经过增长transportConnector 来支持XMPP 协议:
      • Xml 代码
        • <broker xmlns="http://activemq.org/config/1.0">
            <transportConnectors>
             ...
                <transportConnector name="xmpp" uri="xmpp://localhost:61222"/>
            </transportConnectors>
          </broker>
    • ActiveMQ 提供了ActiveMQ messages 和XMPP 之间的双向桥接:
      • 如 果客户加入了一个聊天室,
        • 那么这个聊天室的名字会被映射到一个JMS topic。
      •  尝试在聊天室内发送消息
        • 会致使一个JMS 消息被发送到这个topic。
      •  呆在一个聊天室中意味着这将保持一个对相应JMS topic 的订阅。
        • 所以发送到这个topic 的JMS 消息也会被发送到聊天室。
    • 从4.2 版本起,ActiveMQ 支持Command Agent。
      • 在配置文件中,经过设置commandAgent 来启用Command Agent:
        • <beans>
             <broker useJmx="true" xmlns="http://activemq.org/config/1.0">
                ...
             </broker>
             <commandAgent xmlns="http://activemq.org/config/1.0"/>
          </beans>
    • 启用了Command Agent 的broker 上会有一个来自Command Agent 的链接,
      • 它同时订阅topic: ActiveMQ.Agent。
      • 在你启动XMPP 客户端,
        • 加入到ActiveMQ.Agent 聊天室后,
        • 就能够同broker 进行交谈了。
      • 经过在XMPP 客户端中键入help,能够获得帮助信息。
    • 须要注意的是,
      • ActiveMQ5.0 版本有个小bug,
      • 若是broker 没有采用缺省的用户名和密码,
        • 那么Command Agent 便没法正常启动。
      • Apache 官方文档说,此bug 已经被修正,预约在5.2.0 版本上体现。
    • 修改方式以下:
      • <commandAgent xmlns="http://activemq.org/config/1.0" brokerUser="user" brokerPassword="passward"/>
  • Visualization plugin
    • ActiveMQ 支持以broker 插件的形式生成DOT 文件(能够用agrviewer 来查看),
    • 以图表的方式描述connections、 sessions、producers、consumers、destinations 等信息。
    • 配置方式以下:
      • <broker xmlns="http://activemq.org/config/1.0" brokerName="localhost" useJmx="true">
         ...
          <plugins>
            <connectionDotFilePlugin file="connection.dot"/>
            <destinationDotFilePlugin file="destination.dot"/>
          </plugins>
        </broker>
相关文章
相关标签/搜索