我有一个Java应用程序用于监视Active MQ(版本5.13.0)上的各个队列。此应用程序的目标是连接到Active MQ代理,并找出特定队列的正在进行的消息计数。如果在线消息计数超过50,则发送警报。此应用程序每10分钟执行一次此检查(使用Quartz Scheduler)。 当我连接到它使用的IP地址连接到AMQ的AMQ经纪人,我收到IOException,使用下面的堆栈跟踪 -使用JMX远程连接到Active-MQ
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
我使用下面的代码在连接到AMQ经纪人JMX
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上我的本地机器它适用于运行部署上面的代码。我的意思是,当(Java Client和AMQ)在同一台机器上时,它就可以工作。
2.我已经在AMQ服务器上完成了必要的配置,如此处所述configure JMX for ActiveMQ for remoting access 3.我已经检查了通过telnet在代码中提到的与IP和端口的连接,它可以工作。 4.我还记录了AMQ服务器计算机上的TCP转储,我可以看到请求到达那里。 5.两台机器(运行Tomcat和AMQ的地方)都不是虚拟机,而是同一网络中的专用物理机器。
请帮助:)
非常感谢哈森。但是仍然没有运气:( –
可以发布代理日志,你说**两台机器(Tomcat和AMQ运行的地方)都不是虚拟机,而是同一网络中的专用物理机器**但是jmx尝试连接到本地主机(127.0.0.1),你是在这里'sur的IP JMXServiceURL(“service:jmx:rmi:/// jndi/rmi://192.168.11.72:1099/jmxrmi”);' –
哈森感谢您的回复。请参阅代理日志中的两条WARN日志行,如下所示 –