ActiveMQ-inAction-Broker-学习笔记

自闭症网瘾萝莉.ら 提交于 2019-11-30 08:53:22

Running Broker(运行 broker)

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

Embedded(嵌入的) Broker

  • 可以通过在应用程序中以编码的方式启动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,例如:

  • 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)

  • 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>

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!