直接下载最新版ActiveMQ
1、 ${ACTIVEMQ_HOME}/conf/activemq.xml 中的 broker 节点增加 useJmx="true" 属性
2、 ${ACTIVEMQ_HOME}/conf/activemq.xml 中的 managementContext 节点修改成如下样子
<managementContext>
<managementContext createConnector="true" connectorPort="11099" />
</managementContext>
3、 ${ACTIVEMQ_HOME}/bin/activemq (linux环境) 中,找到 SUNJMX 的配置区域,不同版本会有不同的配置方法
我在5.5这个版本下找到 ACTIVEMQ_SUNJMX_START 变量来对 SUNJMX 进行配置,默认是注释的,不需要做任何 修改,直接增加如下语句即可:
ACTIVEMQ_SUNJMX_START="$ACTIVEMQ_SUNJMX_START -Djava.rmi.server.hostname=自己的IP"
注:如果只改第 1、2 步,也可以用 jconsole 通过 11099 端口监控运行状态,但是只能在本机进行监控。
至此,通过 activemq start 命令启动服务后,就可以通过网络对 本机IP的11099端口进行 JMX 监控了,
不过说实在的,用jconsole或者 jvisualvm 也监控不出什么实质性的东西,主要还得用 activemq 自己提供的监控
API来检查服务器运行状态,这个比较靠谱。
比如如下代码:
RemoteJMXBrokerFacade createConnector = new RemoteJMXBrokerFacade();
System.setProperty("webconsole.jmx.url","service:jmx:rmi:///jndi/rmi://192.168.137.2:11099/jmxrmi");
System.setProperty("webconsole.jmx.user", "admin");
System.setProperty("webconsole.jmx.password", "activemq");
SystemPropertiesConfiguration configuration = new SystemPropertiesConfiguration();
createConnector.setConfiguration(configuration);
try {
BrokerViewMBean brokerAdmin = createConnector.getBrokerAdmin();
System.out.println("==========Connection =================");
System.out.println("BrokerName =" + brokerAdmin.getBrokerName());
System.out.println("TotalMessageCount =" + brokerAdmin.getTotalMessageCount());
System.out.println("TotalConsumerCount =" + brokerAdmin.getTotalConsumerCount());
System.out.println("TotalDequeueCount =" + brokerAdmin.getTotalDequeueCount());
System.out.println("TotalEnqueueCount =" + brokerAdmin.getTotalEnqueueCount());
Collection<TopicViewMBean> topicViewList = createConnector.getTopics();
for (TopicViewMBean topicViewMBean : topicViewList) {
System.out.println("=============Topic =================");
System.out.println("beanName =" + topicViewMBean.getName());
System.out.println("ConsumerCount ="+ topicViewMBean.getConsumerCount());
System.out.println("DequeueCount ="+ topicViewMBean.getDequeueCount());
System.out.println("EnqueueCount ="+ topicViewMBean.getEnqueueCount());
System.out.println("DispatchCount ="+ topicViewMBean.getDispatchCount());
System.out.println("ExpiredCount ="+ topicViewMBean.getExpiredCount());
System.out.println("MaxEnqueueTime ="+ topicViewMBean.getMaxEnqueueTime());
System.out.println("ProducerCount ="+ topicViewMBean.getProducerCount());
System.out.println("MemoryPercentUsage ="+ topicViewMBean.getMemoryPercentUsage());
System.out.println("MemoryLimit =" + topicViewMBean.getMemoryLimit());
}
} catch (Exception e) {
e.printStackTrace();
}
只演示一下API,更多的应用可以通过 API 文档得到解释。