Active MQ(バージョン5.13.0)の個々のキューを監視するjavaアプリケーションがあります。このアプリケーションの目的は、アクティブなMQブローカに接続し、特定のキューの飛行中のメッセージ数を調べることです。飛行中のメッセージ数が50を超える場合は、警告を送信します。このアプリケーションは、このチェックを10分ごとに実行します(Quartz Schedulerの使用)。 私はAMQに接続するためのIPアドレスを使用しています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クライアントとAMQの両方が同じマシン上にある場合、それは機能します。
2.ここで述べたようにAMQサーバに必要な設定を行いましたconfigure JMX for ActiveMQ for remoting access 3. telnetでコードに記載されているIPとポートへの接続をチェックしています。 4. AMQサーバマシンにTCPダンプを記録しました。そこに到達するリクエストを見ることができます。 5.両方のマシン(TomcatとAMQが実行される)は両方とも仮想マシンではなく、同じネットワーク内の専用物理マシンです。
助けてください:)
ありがとうございました。しかし、まだ運がありません:( –
あなたはブローカーログをポストすることができますあなたは言う**両方のマシン(TomcatとAMQが実行される)は仮想マシンではなく、同じネットワーク内の専用物理マシンです**しかしjmxはlocalhost (127.0.0.1)、あなたはここでipの 'JMXServiceURL("サービス:jmx:rmi:/// jndi/rmi://192.168.11.72:1099/jmxrmi ");' –
あなたの返事に感謝しますか?次のようにブローカログの2つのWARNログ行を参照してください –