2011-10-18 23 views
7

我想創建一個java類,它的唯一目的是檢查ActiveMQ代理的狀態(或者連接到ActiveMQ代理,因爲停機可能定義爲客戶端失去網絡連接以及)。檢查ActiveMQ代理的狀態

所以基本上每隔幾秒鐘就會有一個線程運行來檢查代理的狀態,如果代理髮生故障,我想做一些郵件支持組和特定任務的特定任務。

網上的例子不夠詳細,不足以解釋如何達到上述目的。

有人已經做過這個,或者可以建議一個很好的方法來實現這一點?

感謝, Neeraj

回答

6

發送測試消息給經紀人:

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 
} 

連接,發送郵件,如果您收到消息:一切都很好。如果不是......

這就是我所做的。另外我還做了一些其他的東西:

  • 聽幾個諮詢主題,以接收重要事件(如Advisory.FULL),這是重要的事件,有些事情是錯誤的。
  • 定期從統計信息插件獲取代理統計信息,以監控消息內存大小和消息存儲。
  • 配置一個死信隊列,所以我知道消息何時被消費者拒絕。
+0

即使代理關閉並且沒有響應,或者是否存在巨大的網絡延遲,catch塊是否會被執行? – 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新手(因爲我是直到上個月)我張貼示例啓動實現。它只是爲每個事件寫入日誌。在實際環境中可以想想transportInterupted()重新連接試驗,直到transportResumed()或類似,很多事情更多...

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 –