2011-10-18 12 views
7

ActiveMQブローカーの状態をチェックする唯一の目的であるJavaクラスを作成したいのですが(ActiveMQブローカーへの接続は、クライアントがネットワーク接続を失う同じように)。ActiveMQブローカーの状態を確認してください

基本的には、ブローカのステータスを確認するために数秒ごとに実行されるスレッドが存在し、ブローカがダウンしている場合は、サポートグループに郵送するという特別な作業をしたいと思います。

オンラインの例は、上記の達成方法を説明するのに十分ではありません。

誰かがすでにこれを行っているのですか、これを実現する良い方法を提案できますか?

おかげで、 Neeraj

答えて

6

はブローカーにTestmessageを送る:あなたがメッセージを受け取る場合

try { 
    ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory("tcp://localhost:61616"); 
    Connection conn = factory.createConnection(user, password); 
    Session session = conn.createSession(false, Session.AUTO_ACKNOWLEDGE); 
    MessageProducer producer = session.createProducer("test"); 
    MessageConsumer consumer = session.createConsumer("test"); 
    consumer.setMessageListener(this); // class that implements MessageListener 
    conn.start(); 
    TextMessage message = new ActiveMQTextMessage(); 
    message.setText("TestMessage"); 
    producer.send(message); 
} catch (JMSException e) { 
    // somethings very wrong 
} 

は、メッセージを送信し、接続:すべての罰金です。そうでない場合....

thats私は何をしますか。また、私はいくつかの他のものの操作を行います。

  • を間違っ代の重要な指標である(Advisory.FULLのような)重要なイベントを受け取るために、いくつかの諮問トピックに耳を傾けます。
  • 定期的に統計プラグインからブローカ統計を取得して、メッセージメモリサイズとメッセージストアを監視します。
  • メッセージがコンシューマによって拒否されたときを知るように、デッドレターキューを設定します。
+0

ブローカがダウンして応答しなくてもキャッチブロックが実行されますか、またはネットワークの遅延が大きい場合は、 – Neeraj

+0

ブローカが停止しているときにcreateConnection呼び出しが失敗し、例外がキャッチされます。ネットワークの遅延をチェックしたいだけなら、遠隔地から手動でサーバにpingする必要があります。ループバックデバイスは決して遅くありません。 – Laures

7

以下もActiveMQのが稼働しているかどうかを確認するために動作します:私は同じ質問のためのソリューションを必要として

try { 
    ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory(url); 
    // set transport listener so that active MQ start is notified. 
    factory.setTransportListener(transportListenerObject); 
    Connection connection = factory.createConnection(); 
    // This will throw error if activeMQ is not running. 
    connection.setClientID("my_client_id"); 
} catch (JMSException ex) { 
    if (ex.getLinkedException() instanceof IOException) { 
     // ActiveMQ is not running. Do some logic here. 
     // use the TransportListener to restart the activeMQ connection 
     // when activeMQ comes back up. 
    } else { 
     // Something seriously went wrong with the factory or connection 
     // creation. Abort the process here, as nothing can be done. 
     // Log the error and troubleshoot. 
    } 
} 
+0

なぜこれを下落させたのですか? – Anand

+0

どのようにして、TransportListenerを使用して、activeMQブローカが復帰したときに再起動できますか? – CoderX

7

、私はそれについての詳細を読んで、いくつかのテストをした理由です。

いくつかの環境でテストメッセージを送信すると、問題が発生することがあります(Laures)。

「通常の方法では、TransportListenerを(Anandとして提案する)設定することができますが、実際には提供されたインターフェイスを実装し、報告されたイベントに反応します。

(他のActiveMQ初心者のために)私はサンプルスタートアップ実装を投稿します。各イベントのログを書き込むだけです。 1はtransportResumed()または類似しており、多くのものよりまでtransportInterupted()での再接続の試行を考えることができます実環境...

import java.io.IOException; 

import org.apache.activemq.transport.TransportListener; 
import org.apache.log4j.Logger; 

class ConnectionStateMonitor 
    implements TransportListener 
{ 
    private static final Logger log = Logger.getLogger(ConnectionStateMonitor.class); 

    @Override 
    public void onCommand(Object command) 
    { 
    log.debug("Command detected: '" + command + "'"); 
    } 

    @Override 
    public void onException(IOException exception) 
    { 
    log.error("Exception detected: '" + exception + "'"); 
    } 

    @Override 
    public void transportInterupted() 
    { 
    log.error("Transport interuption detected."); 
    } 

    @Override 
    public void transportResumed() 
    { 
    log.info("Transport resumption detected."); 
    } 
} 

ではなTransportListenerは、例えばを設定することができます。:

ActiveMQConnection connection = (ActiveMQConnection) _factory.createConnection(); 
... 
connection.addTransportListener(new ConnectionStateMonitor()); 

お楽しみに!

+0

また、接続URI「failover:tcp:// host:port」でフェールオーバーを使用することもできます。これは、ソケット例外がある場合、自動的に再接続するようにクライアントに指示します。http://activemq.apache.org/how-can-i-support-auto-reconnection.html –

関連する問題