使用 JMX 远程连接到 Active-MQ
Remote connection to Active-MQ Using JMX
我有一个 java 应用程序用于监视 Active MQ(版本 5.13.0)上的各个队列。此应用程序的 Objective 用于连接到 Active MQ 代理并找出特定队列的正在运行的消息计数。如果飞行消息计数超过 50,则它会发送警报。此应用程序每 10 分钟执行一次此检查(使用 Quartz Scheduler)。
当我连接到使用 IP 地址连接到 AMQ 的 AMQ 代理时,我收到带有以下堆栈跟踪的 IOException -
java.rmi.ConnectException: Connection refused to host: 127.0.0.1; nested exception is:
java.net.ConnectException: Connection refused: connect
at sun.rmi.transport.tcp.TCPEndpoint.newSocket(Unknown Source)
at sun.rmi.transport.tcp.TCPChannel.createConnection(Unknown Source)
at sun.rmi.transport.tcp.TCPChannel.newConnection(Unknown Source)
at sun.rmi.server.UnicastRef.invoke(Unknown Source)
at javax.management.remote.rmi.RMIServerImpl_Stub.newClient(Unknown Source)
at javax.management.remote.rmi.RMIConnector.getConnection(Unknown Source)
at javax.management.remote.rmi.RMIConnector.connect(Unknown Source)
at javax.management.remote.JMXConnectorFactory.connect(Unknown Source)
at javax.management.remote.JMXConnectorFactory.connect(Unknown Source)
at com.globalcharge.quartz.job.CheckPendingConsumer.execute(CheckPendingConsumer.java:51)
at org.quartz.core.JobRunShell.run(JobRunShell.java:202)
at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:525)
Caused by: java.net.ConnectException: Connection refused: connect
at java.net.DualStackPlainSocketImpl.connect0(Native Method)
at java.net.DualStackPlainSocketImpl.socketConnect(Unknown Source)
at java.net.AbstractPlainSocketImpl.doConnect(Unknown Source)
at java.net.AbstractPlainSocketImpl.connectToAddress(Unknown Source)
at java.net.AbstractPlainSocketImpl.connect(Unknown Source)
at java.net.PlainSocketImpl.connect(Unknown Source)
at java.net.SocksSocketImpl.connect(Unknown Source)
at java.net.Socket.connect(Unknown Source)
at java.net.Socket.connect(Unknown Source)
at java.net.Socket.<init>(Unknown Source)
at java.net.Socket.<init>(Unknown Source)
at sun.rmi.transport.proxy.RMIDirectSocketFactory.createSocket(Unknown Source)
at sun.rmi.transport.proxy.RMIMasterSocketFactory.createSocket(Unknown Source)
... 12 more
我正在使用以下代码通过 JMX 连接到 AMQ 代理
JMXServiceURL url = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://192.168.11.72:1099/jmxrmi");
JMXConnector jmxc = JMXConnectorFactory.connect(url);
MBeanServerConnection conn = jmxc.getMBeanServerConnection();
ObjectName activeMq = new ObjectName("org.apache.activemq:Type=Broker,BrokerName=localhost");
BrokerViewMBean mbean = (BrokerViewMBean)MBeanServerInvocationHandler.newProxyInstance(conn, activeMq, BrokerViewMBean.class, true);
//for each queue
for(ObjectName name : mbean.getQueues())
{
if(("dbg.notmanager.netsizeDelivery".equals(name)))
{
//obtain an instance of QueueViewMBean
QueueViewMBean queueMbean = (QueueViewMBean)MBeanServerInvocationHandler.newProxyInstance(conn, name, QueueViewMBean.class, true);
long inFlight = queueMbean.getInFlightCount();
if(inFlight >= 50)
{
sender.sendPassiveCriticalAlert(hostname, "Passive.GCDBG", "InFlight Messages for a consumer on " + name);
}
}
备注:
1. 如果我在我的本地机器上安装 AMQ 并在我的本地机器上的 Tomcat 运行ning 上部署上面的代码,它就可以工作。我的意思是,当(Java Client 和 AMQ )都在同一台机器上时,它可以工作。
2. 我已经按照此处所述在 AMQ 服务器上完成了必要的配置 configure JMX for ActiveMQ for remoting access
3. 我已经通过 telnet 检查了代码中提到的 IP 和端口的连接,它可以正常工作。
4. 我还在 AMQ 服务器机器上记录了 TCP 转储,我可以看到请求到达那里。
5.两台机器(其中Tomcat和AMQ运行)都不是虚拟机,而是同一网络中的专用物理机。
请帮忙:)
正如日志所说 Connection refused
,我认为连接配置错误。
您也需要这些凭据
JMXServiceURL url = ...;
Map env = ...;
String[] creds = {"admin", "activemq"};
env.put(JMXConnector.CREDENTIALS, creds);
JMXConnector jmxc = JMXConnectorFactory.connect(url, env);
我现在可以使用 JConsole 以及我编写的 Java 代码进行连接。问题出在 env 文件中(在 amqHome/bin/ 下)有一个 属性 java.rmi.server.hostname,其值为 127.0.0.1
我将此值更改为 192.168.11.72(机器的 IP)并且它有效....
感谢大家的支持....
我有一个 java 应用程序用于监视 Active MQ(版本 5.13.0)上的各个队列。此应用程序的 Objective 用于连接到 Active MQ 代理并找出特定队列的正在运行的消息计数。如果飞行消息计数超过 50,则它会发送警报。此应用程序每 10 分钟执行一次此检查(使用 Quartz Scheduler)。 当我连接到使用 IP 地址连接到 AMQ 的 AMQ 代理时,我收到带有以下堆栈跟踪的 IOException -
java.rmi.ConnectException: Connection refused to host: 127.0.0.1; nested exception is:
java.net.ConnectException: Connection refused: connect
at sun.rmi.transport.tcp.TCPEndpoint.newSocket(Unknown Source)
at sun.rmi.transport.tcp.TCPChannel.createConnection(Unknown Source)
at sun.rmi.transport.tcp.TCPChannel.newConnection(Unknown Source)
at sun.rmi.server.UnicastRef.invoke(Unknown Source)
at javax.management.remote.rmi.RMIServerImpl_Stub.newClient(Unknown Source)
at javax.management.remote.rmi.RMIConnector.getConnection(Unknown Source)
at javax.management.remote.rmi.RMIConnector.connect(Unknown Source)
at javax.management.remote.JMXConnectorFactory.connect(Unknown Source)
at javax.management.remote.JMXConnectorFactory.connect(Unknown Source)
at com.globalcharge.quartz.job.CheckPendingConsumer.execute(CheckPendingConsumer.java:51)
at org.quartz.core.JobRunShell.run(JobRunShell.java:202)
at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:525)
Caused by: java.net.ConnectException: Connection refused: connect
at java.net.DualStackPlainSocketImpl.connect0(Native Method)
at java.net.DualStackPlainSocketImpl.socketConnect(Unknown Source)
at java.net.AbstractPlainSocketImpl.doConnect(Unknown Source)
at java.net.AbstractPlainSocketImpl.connectToAddress(Unknown Source)
at java.net.AbstractPlainSocketImpl.connect(Unknown Source)
at java.net.PlainSocketImpl.connect(Unknown Source)
at java.net.SocksSocketImpl.connect(Unknown Source)
at java.net.Socket.connect(Unknown Source)
at java.net.Socket.connect(Unknown Source)
at java.net.Socket.<init>(Unknown Source)
at java.net.Socket.<init>(Unknown Source)
at sun.rmi.transport.proxy.RMIDirectSocketFactory.createSocket(Unknown Source)
at sun.rmi.transport.proxy.RMIMasterSocketFactory.createSocket(Unknown Source)
... 12 more
我正在使用以下代码通过 JMX 连接到 AMQ 代理
JMXServiceURL url = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://192.168.11.72:1099/jmxrmi");
JMXConnector jmxc = JMXConnectorFactory.connect(url);
MBeanServerConnection conn = jmxc.getMBeanServerConnection();
ObjectName activeMq = new ObjectName("org.apache.activemq:Type=Broker,BrokerName=localhost");
BrokerViewMBean mbean = (BrokerViewMBean)MBeanServerInvocationHandler.newProxyInstance(conn, activeMq, BrokerViewMBean.class, true);
//for each queue
for(ObjectName name : mbean.getQueues())
{
if(("dbg.notmanager.netsizeDelivery".equals(name)))
{
//obtain an instance of QueueViewMBean
QueueViewMBean queueMbean = (QueueViewMBean)MBeanServerInvocationHandler.newProxyInstance(conn, name, QueueViewMBean.class, true);
long inFlight = queueMbean.getInFlightCount();
if(inFlight >= 50)
{
sender.sendPassiveCriticalAlert(hostname, "Passive.GCDBG", "InFlight Messages for a consumer on " + name);
}
}
备注:
1. 如果我在我的本地机器上安装 AMQ 并在我的本地机器上的 Tomcat 运行ning 上部署上面的代码,它就可以工作。我的意思是,当(Java Client 和 AMQ )都在同一台机器上时,它可以工作。
2. 我已经按照此处所述在 AMQ 服务器上完成了必要的配置 configure JMX for ActiveMQ for remoting access
3. 我已经通过 telnet 检查了代码中提到的 IP 和端口的连接,它可以正常工作。
4. 我还在 AMQ 服务器机器上记录了 TCP 转储,我可以看到请求到达那里。
5.两台机器(其中Tomcat和AMQ运行)都不是虚拟机,而是同一网络中的专用物理机。
请帮忙:)
正如日志所说 Connection refused
,我认为连接配置错误。
您也需要这些凭据
JMXServiceURL url = ...;
Map env = ...;
String[] creds = {"admin", "activemq"};
env.put(JMXConnector.CREDENTIALS, creds);
JMXConnector jmxc = JMXConnectorFactory.connect(url, env);
我现在可以使用 JConsole 以及我编写的 Java 代码进行连接。问题出在 env 文件中(在 amqHome/bin/ 下)有一个 属性 java.rmi.server.hostname,其值为 127.0.0.1 我将此值更改为 192.168.11.72(机器的 IP)并且它有效....
感谢大家的支持....