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();
-
- Java 代码
- 启动多个broker,那么需要为broker 设置一个名字。例如:
- Java 代码
-
BrokerService broker = new BrokerService(); broker.setName("fred"); broker.addConnector("tcp://localhost:61616"); broker.start();
-
- 如果希望在同一个JVM 内访问这个broker,
- 那么可以使用VM Transport,
- URI是:vm://brokerName。
- Java 代码
可以通过BrokerFactory 来创建broker,例如:
- Java 代码
-
someURI 的可选值如下:BrokerService broker = BrokerFactory.createBroker(new URI(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>
-
- Xml 代码
- Java 代码
Monitoring Broker(监控broker)
- JMX
- 在使用JMX 监控broker 之前,
- 首先要启用broker 的JMX 监控功能,
- 例如在配置文件中设置useJmx="true",
- 首先要启用broker 的JMX 监控功能,
- 如下:
-
<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)。
- 在使用JMX 监控broker 之前,
- 首先要禁止ActiveMQ 创建自己的connector,例如:
- Xml 代码
-
<broker xmlns="http://activemq.org/config/1.0" brokerName="localhost" useJmx="true"> <managementContext> <managementContext createConnector="false"/> </managementContext> </broker>
-
- Xml 代码
- 然后在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
-
- 如下:conf/jmx.access:
- 然后修改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
-
- 查找包含"SUNJMX="的一行如下:
- 最后重启ActiveMQ 和jconsole,这时候需要强制login。
- 如果在启动activemq的过程中出现以下错误,
- 那么需要为这个文件增加访问 控制。
- 如果在启动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。
- Web Console 被集成到了ActiveMQ 的二进制发布包中,
- 需要注意的是,
- 要将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/,
- 查看显示是否正常。
- 因此实际上起作用的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
- consumers, producers and 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 会在稍后介绍)。
- Client based advisories
- 例如,
- 如果你希望订阅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. >。
- 如果你希望订阅FOO.BAR 这个queue 上Consumer 的start/stop 的消息,
- org.apache.activemq.advisory.AdvisorySupport 类上有如下的helpermethods,
- 用来在程序中得到advisory destination objects。
- Java 代码
-
AdvisorySupport.getConsumerAdvisoryTopic() AdvisorySupport.getProducerAdvisoryTopic() AdvisorySupport.getDestinationAdvisoryTopic() AdvisorySupport.getExpiredTopicMessageAdvisoryTopic() AdvisorySupport.getExpiredQueueMessageAdvisoryTopic() AdvisorySupport.getNoTopicConsumersAdvisoryTopic() AdvisorySupport.getNoQueueConsumersAdvisoryTopic()
-
- Java 代码
- 用来在程序中得到advisory destination objects。
- 以下是段使用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); } } }
-
- ActiveMQ 支持Advisory Messages,
- 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>
-
- Xml 代码
- 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>
-
- 在配置文件中,通过设置commandAgent 来启用Command Agent:
- 启用了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>
-
来源:oschina
链接:https://my.oschina.net/u/3847203/blog/2992417