【问题标题】:Remote connection to Active-MQ Using JMX使用 JMX 远程连接到 Active-MQ
【发布时间】:2017-01-21 02:27:16
【问题描述】:

我有一个 Java 应用程序,用于监控 Active MQ(版本 5.13.0)上的各个队列。此应用程序的目标是连接到 Active MQ 代理并找出特定队列的运行中消息计数。如果飞行中的消息计数超过 50 则它会发送警报。此应用程序每 10 分钟执行一次此检查(使用 Quartz 调度程序)。 当我连接到使用 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 上,它就可以工作。我的意思是,当(Java Client 和 AMQ )都在同一台机器上时,它可以工作。
2.我已经在AMQ服务器上完成了必要的配置,这里提到configure JMX for ActiveMQ for remoting access 3.我已经通过telnet检查了代码中提到的IP和端口的连接,它可以工作。 4. 我还在 AMQ 服务器机器上记录了 TCP 转储,我可以看到请求到达那里。 5. 两台机器(Tomcat 和 AMQ 运行的地方)都不是虚拟机,而是同一个网络中的专用物理机。

请帮忙:)

【问题讨论】:

    标签: activemq jmx


    【解决方案1】:

    正如日志所说Connection refused,我认为连接配置错误。 你也需要这些凭据

    JMXServiceURL url = ...;
    Map env = ...;
    String[] creds = {"admin", "activemq"};
    env.put(JMXConnector.CREDENTIALS, creds);
    JMXConnector jmxc = JMXConnectorFactory.connect(url, env);
    

    【讨论】:

    • 非常感谢哈森。但仍然没有运气:(
    • 你能发布代理日志吗?你说 两台机器(Tomcat 和 AMQ 运行的地方)不是虚拟机,而是同一网络中的专用物理机。 但是 jmx 尝试连接到 localhost (127.0.0.1) ,你是ip在这里JMXServiceURL("service:jmx:rmi:///jndi/rmi://192.168.11.72:1099/jmxrmi");
    • 哈森感谢您的回复。我在代理日志中看到两条 WARN 日志行,如下所示
    • 2016-09-14 11:20:42,423 |警告 |传输连接到:tcp://192.168.11.219:10587 失败:org.apache.activemq.transport.InactivityIOException:无法发送,通道已经失败:tcp://192.168.11.219:10587 | org.apache.activemq.broker.TransportConnection.Transport |异步异常处理程序
    • - 2016-09-14 11:20:42,346 |警告 |传输连接到:tcp://192.168.11.219:10587 失败:java.net.SocketException:连接重置 | org.apache.activemq.broker.TransportConnection.Transport | ActiveMQ 传输:tcp:///192.168.11.219:10587@61616
    【解决方案2】:

    我现在可以使用 JConsole 以及我编写的 Java 代码进行连接。问题出在 env 文件中(在 amqHome/bin/ 下)有一个属性 java.rmi.server.hostname,其值为 127.0.0.1 我将此值更改为 192.168.11.72(机器的 IP),它工作了....

    感谢大家的支持....

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-05-22
      • 2010-10-24
      • 1970-01-01
      • 2016-06-29
      • 1970-01-01
      • 1970-01-01
      • 2014-05-01
      • 2020-01-04
      相关资源
      最近更新 更多