activemq 监控开启jmx监控 有影响吗

用户名:nettm
访问量:32447
注册日期:
阅读量:1297
阅读量:3317
阅读量:445717
阅读量:1131162
51CTO推荐博文
&通过JMX来监控管理ActiveMQ
1、修改ActiveMQ的配置文件activemq.xml
&useJmx=&true&&persistent=&true&&brokerName=&broker-master&&xmlns=&http://activemq.apache.org/schema/core&&
使其useJmx属性为true,默认的jmx端口号为1099,可以通过设置managementContext的相关属性来修改。
2、修改ActiveMQ的启动文件bin/activemq
ACTIVEMQ_SUNJMX_START=&-Dcom.sun.management.jmxremote.port=11099&&ACTIVEMQ_SUNJMX_START=&$ACTIVEMQ_SUNJMX_START&-Dcom.sun.management.jmxremote.password.file=${ACTIVEMQ_CONF}/jmx.password&&ACTIVEMQ_SUNJMX_START=&$ACTIVEMQ_SUNJMX_START&-Dcom.sun.management.jmxremote.access.file=${ACTIVEMQ_CONF}/jmx.access&&ACTIVEMQ_SUNJMX_START=&$ACTIVEMQ_SUNJMX_START&-Dcom.sun.management.jmxremote.ssl=false&&ACTIVEMQ_SUNJMX_START=&$ACTIVEMQ_SUNJMX_START&-Dcom.sun.management.jmxremote&&&ACTIVEMQ_SUNJMX_CONTROL=&--jmxurl&service:jmx:rmi:///jndi/rmi://127.0.0.1:11099/jmxrmi&--jmxuser&controlRole&--jmxpassword&abcd1234&&
开启远端JMX端口11099,这里的端口与activemq.xml里面配置的jmx端口号(默认是1099)不能重复。
3、修改口令文件并设置口令文件的权限,否则启动activemq时会报错误
jmx.access
admin&readwrite&monitorRole&readonly&controlRole&readwrite&
jmx.password
admin&activemq&monitorRole&abc123&controlRole&abcd1234&
修改配置文件的权限:
sudo&&chmod&600&&/opt/activemq/conf/jmx.password&&sudo&&chmod&600&&/opt/activemq/conf/jmx.access&
4、修改/etc/hosts文件
把127.0.0.1替换为本机IP,例如:
#&127.0.0.1&&&&&&&&&&&&&vm-108&localhost.localdomain&localhost&10.10.18.108&&&&&&&&&&&&vm-108&localhost.localdomain&localhost&
使用sudo ./activemq consoel启动activemqmq时会在控制台打印日志
启动activemq,查看jmx服务是否正常
5、打开jconsole.exe,在连接画面中填入服务器地址:
远程地址可填入:
10.10.18.108:1099&或者&service:jmx:rmi:///jndi/rmi://10.10.18.108:1099/jmxrmi&
&用户名:controlRole
密码:abcd1234
连接成功后的管理画面
本文参考了:
http://blog.csdn.net/lucett/article/details/7024756本文出自 “” 博客,请务必保留此出处
了这篇文章
类别:┆阅读(0)┆评论(0)ActiveMQ监控队列状态报javax.management.InstanceNotFoundException
private static String brokerURI=&tcp://localhost:12345&;
public static int connectorPort = 1099;
public static String connectorPath = &/jmxrmi&;
BrokerService
broker=new BrokerService();
broker.addConnector(brokerURI);
broker.setPersistent(true);
broker.setUseJmx(true);
ManagementContext context = broker.getManagementContext();
context.setConnectorPort(connectorPort);
context.setConnectorPath(connectorPath);
context.setCreateConnector(true);
context.setCreateMBeanServer(true);
broker.start();
System.out.println(broker.getBrokerName());
// localhost
System.out.println(context.getJmxDomainName());
//org.apache.activemq
JMXServiceURL url = new JMXServiceURL(&service:jmx:rmi:///jndi/rmi://localhost:& + connectorPort + connectorPath);
JMXConnector connector = JMXConnectorFactory.connect(url, null);
MBeanServerConnection connection = connector.getMBeanServerConnection();
ObjectName name = new ObjectName(&org.apache.activemq:BrokerName=localhost,Type=Broker&);
BrokerViewMBean mBean = (BrokerViewMBean) MBeanServerInvocationHandler.newProxyInstance(connection, name, BrokerViewMBean.class, true);
System.out.println(mBean.getBrokerName());
&调用到mBean.getBrokerName()时会报异常:
javax.management.InstanceNotFoundException: org.apache.activemq:BrokerName=localhost,Type=Broker
&&& at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.getMBean(DefaultMBeanServerInterceptor.java:1095)
&&& at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.getAttribute(DefaultMBeanServerInterceptor.java:643)
&&& at com.sun.jmx.mbeanserver.JmxMBeanServer.getAttribute(JmxMBeanServer.java:678)
&&& at javax.management.remote.rmi.RMIConnectionImpl.doOperation(RMIConnectionImpl.java:1464)
&&& at javax.management.remote.rmi.RMIConnectionImpl.access$300(RMIConnectionImpl.java:97)
&&& at javax.management.remote.rmi.RMIConnectionImpl$PrivilegedOperation.run(RMIConnectionImpl.java:1328)
&&& at javax.management.remote.rmi.RMIConnectionImpl.doPrivilegedOperation(RMIConnectionImpl.java:1420)
&&& at javax.management.remote.rmi.RMIConnectionImpl.getAttribute(RMIConnectionImpl.java:657)
&&& at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
&&& at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
&&& at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
&&& at java.lang.reflect.Method.invoke(Method.java:606)
&&& at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:322)
&&& at sun.rmi.transport.Transport$1.run(Transport.java:177)
&&& at sun.rmi.transport.Transport$1.run(Transport.java:174)
&&& at java.security.AccessController.doPrivileged(Native Method)
&&& at sun.rmi.transport.Transport.serviceCall(Transport.java:173)
&&& at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:556)
&&& at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:811)
&&& at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:670)
&&& at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
&&& at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
&&& at java.lang.Thread.run(Thread.java:744)
&&& at sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer(StreamRemoteCall.java:275)
&&& at sun.rmi.transport.StreamRemoteCall.executeCall(StreamRemoteCall.java:252)
&&& at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:161)
&&& at com.sun.jmx.remote.internal.PRef.invoke(Unknown Source)
&&& at javax.management.remote.rmi.RMIConnectionImpl_Stub.getAttribute(Unknown Source)
&&& at javax.management.remote.rmi.RMIConnector$RemoteMBeanServerConnection.getAttribute(RMIConnector.java:913)
&&& at javax.management.MBeanServerInvocationHandler.invoke(MBeanServerInvocationHandler.java:267)
ObjectName的确是&org.apache.activemq:BrokerName=localhost,Type=Broker&,应该没有错误。为何会提示实例不存在呢。。。。。。。。
我有哪里写错了么?&
找到原因了。。。。
org.apache.activemq:BrokerName=localhost,Type=Broker
中的BrokerName与Type必须首字小写
org.apache.activemq:brokerName=localhost,type=Broker
大写小敏感。。真是没想到。系统上线运行后,及时监控报警是很必要的手段,对于ActiveMQ而言,主要监控的指标有:MQ本身的健康状况、每个队列的生产者数量、消费者数量、队列的当前消息数等。
ActiveMQ支持JMX监控,使用步骤如下:
一、修改conf/activemq.xml
&broker & useJmx="true&&
&managementContext&
&managementContext createConnector="true" connectorPort=&jmx端口号& connectorHost=&本机ip地址" /&
&/managementContext&
二、设置jmx.access、jmx.password的文件权限
chmod 400 conf/jmx.*
(即:将jmx.password, jmx.access这二个文件设置成只读权限,activemq出于安全考虑,要求这二个文件只读)
三、修改bin\activemq 启动shell脚本
找到invoke_start(){ 这段,然后在前面插入:
ACTIVEMQ_CONF=&jmx.password所在位置的物理路目录"
ACTIVEMQ_SUNJMX_START="-Dcom.sun.management.jmxremote.port=端口号 "
ACTIVEMQ_SUNJMX_START="$ACTIVEMQ_SUNJMX_START -Dcom.sun.management.jmxremote.password.file=${ACTIVEMQ_CONF}/jmx.password"
ACTIVEMQ_SUNJMX_START="$ACTIVEMQ_SUNJMX_START -Dcom.sun.management.jmxremote.access.file=${ACTIVEMQ_CONF}/jmx.access"
ACTIVEMQ_SUNJMX_START="$ACTIVEMQ_SUNJMX_START -Dcom.sun.management.jmxremote.ssl=false"
然后重启activemq即可。
然后在jconsole中,可以输入 ip地址:jmx端口号
其中username,password即jmx.password中定义的用户名和密码。
四、 spring中使用JMX
&bean class="org.springframework.jmx.support.MBeanServerConnectionFactoryBean" id="mbeanServerConnection1"&
&property name="serviceUrl" value="${mq_jmx_url1}"/&
&property name="connectOnStartup" value="false"/&
&property name="environment"&
&prop key="java.naming.security.principal"&
${mq_jmx_user1}
&prop key="java.naming.security.credentials"&
${mq_jmx_passwor1}
&/property&
其中serviceUrl的值类似:service:jmx:rmi:///jndi/rmi://localhost:1099/jmxrmi
参考示例:
private List&ActiveMQData& getMonitorDataList(MBeanServerConnection conn, String objectName) {
List&ActiveMQData& datas = new ArrayList&&();
ObjectName objRootName = new ObjectName(objectName);
String brokerName = (String) conn.getAttribute(objRootName, "BrokerName");
String brokerId = (String) conn.getAttribute(objRootName, "BrokerId");
String openWireUrl = (String) conn.getAttribute(objRootName, "OpenWireURL");
//健康状态
ObjectName healthObjName = new ObjectName(objectName + ",service=Health");
String healthStatus = (String) conn.getAttribute(healthObjName, "CurrentStatus");
//遍历队列
ObjectName[] objectNames = (ObjectName[]) conn.getAttribute(objRootName, "Queues");
Arrays.sort(objectNames);
List&String& blackList = monitorConfig.getQueueBlackList();
for (ObjectName queueName : objectNames) {
Long queueSize = (Long) conn.getAttribute(queueName, "QueueSize");//队列消息数量
Long producerCount = (Long) conn.getAttribute(queueName, "ProducerCount");//生产者数量
Long consumerCount = (Long) conn.getAttribute(queueName, "ConsumerCount");//消费者数量
Long enqueueCount = (Long) conn.getAttribute(queueName, "EnqueueCount");//入队消息总数
Long dequeueCount = (Long) conn.getAttribute(queueName, "DequeueCount");//出队消息总数
} catch (Exception e) {
其中objectName值,可以在jconsole中查到 
阅读(...) 评论()相关热词搜索:
延伸阅读:
频道总排行
频道本月排行JMX远程连不上ActiveMQ - ITeye问答
现在要用JMX来远程地监控与操作ActiveMQ,不过, 悲催的是, 第一步就有问题了, 远程的ActiveMQ连不上。 Google加Baidu了半天,看到的方法都试过了,还是不行。郁闷。现在静下心来回顾下JMX远程连接ActiveMQ的思路。 JMX连接有两种方式:1,普通端口号(非jmxrmi)方式。在默认脚本activemq基础上只改了下面的内容,其它的没动:ACTIVEMQ_SUNJMX_START=&-Dcom.sun.management.jmxremote.port=11099 &ACTIVEMQ_SUNJMX_START=&$ACTIVEMQ_SUNJMX_START -Dcom.sun.management.jmxremote.password.file=${ACTIVEMQ_CONF}/jmx.password&ACTIVEMQ_SUNJMX_START=&$ACTIVEMQ_SUNJMX_START -Dcom.sun.management.jmxremote.access.file=${ACTIVEMQ_CONF}/jmx.access&ACTIVEMQ_SUNJMX_START=&$ACTIVEMQ_SUNJMX_START -Dcom.sun.management.jmxremote.ssl=false&#ACTIVEMQ_SUNJMX_START=&$ACTIVEMQ_SUNJMX_START -Dcom.sun.management.jmxremote&客户端这边是直接通过jconsole方式连接的,没有用Java代码连接。 如下所示:
这里的用户名密码是admin/activemq。
应该不是用户名密码用错了吧?
jconsole上直接报“连接失败”错误。
2, jmxrmi方式。
在默认脚本activemq基础上只改了下面的内容,其它的没动:
ACTIVEMQ_SUNJMX_CONTROL="--jmxurl service:jmx:rmi:///jndi/rmi://127.0.0.1:1099/jmxrmi --jmxuser controlRole --jmxpassword abcd1234"
#ACTIVEMQ_SUNJMX_CONTROL=""
/etc/hosts文件中新加了“127.0.0.1
192.168.40.50”, 这里的192.168.40.50是远程服务器的IP。
这时用java代码连接, 代码如下:
RemoteJMXBrokerFacade createConnector = new RemoteJMXBrokerFacade();
System.setProperty("webconsole.jmx.url", "service:jmx:rmi:///jndi/rmi://192.168.40.50:1099/jmxrmi");
System.setProperty("webconsole.jmx.user","controlRole");
System.setProperty("webconsole.jmx.password","abcd1234");
SystemPropertiesConfiguration configuration = new SystemPropertiesConfiguration();
createConnector.setConfiguration(configuration);
BrokerViewMBean brokerAdmin = createConnector.getBrokerAdmin();
Java运行时报这样的异常:
java.lang.RuntimeException: java.rmi.ConnectException: Connection refused to host: 192.168.40.50; nested exception is:
剩下的试了不少方法, 类似的有, 但都不行。
于是, 不想再瞎试了, 想系统地研究下JMX远程连接ActiveMQ的事。
请问谁哪有JMX远程连接ActiveMQ的时序图?或相关的材料?
注: 远程服务器上防火墙已经不再拦截端口号1099。
问题补充:这里边涉及到的概念有: hostname, sub,
这些天JMX远程连ActiveMQ时有什么用?
能不能系统地解释下?
问题补充:连本地的ActiveMQ一点事也没有。
问题补充:现在我开启log方式再启动jconsole时, 看到下面的信息:
FINER: [javax.management.remote.rmi.RMIConnector: jmxServiceURL=service:jmx:rmi:///jndi/rmi://192.168.40.50:1099/jmxrmi] connecting...
九月 04, :33 下午 RMIConnector connect
FINER: [javax.management.remote.rmi.RMIConnector: jmxServiceURL=service:jmx:rmi:///jndi/rmi://192.168.40.50:1099/jmxrmi] finding stub...
九月 04, :55 下午 RMIConnector connect
FINER: [javax.management.remote.rmi.RMIConnector: jmxServiceURL=service:jmx:rmi:///jndi/rmi://192.168.40.50:1099/jmxrmi] connecting stub...
九月 04, :55 下午 RMIConnector connect
FINER: [javax.management.remote.rmi.RMIConnector: jmxServiceURL=service:jmx:rmi:///jndi/rmi://192.168.40.50:1099/jmxrmi] getting connection...
九月 04, :16 下午 RMIConnector connect
FINER: [javax.management.remote.rmi.RMIConnector: jmxServiceURL=service:jmx:rmi:///jndi/rmi://192.168.40.50:1099/jmxrmi] failed to connect: java.rmi.ConnectException: Connection refused to host: 192.168.40.50; nested exception is:
java.net.ConnectException: Connection timed out: connect
这说明stub连接成功了, 那么stub成功后,再连接时连接了什么?可能会有什么问题?
问题补充:到现在, 算是解决了, 参考/jmxetc/entry/connecting_through_firewall_using_jmx。
1, 我现在的方法是把服务器上的firewall给关掉。 现在没事了。
2, 下一步, 想着用/jmxetc/entry/connecting_through_firewall_using_jmx里给的premain,从而不至于把firewall给彻底关掉。
t/jmxetc/entry/connecting_through_firewall_using_jmx里给的premain,从而不至于把firewall给彻底关掉。 楼主现在这种方式解决没
试试 我这篇评论的方法
你把activemq.xml 监听地址,改成
uri="tcp://0.0.0.0:8008"
默认监听hostname 因此ip不行
http://activemq.2283324./Connection-refused-with-embeded-AMQ-in-Tomcat-td2363352.html
/problems/87942
已解决问题
未解决问题

我要回帖

更多关于 activemq jmx 监控 的文章

 

随机推荐