我想創建一個java類,它的唯一目的是檢查ActiveMQ代理的狀態(或者連接到ActiveMQ代理,因爲停機可能定義爲客戶端失去網絡連接以及)。檢查ActiveMQ代理的狀態
所以基本上每隔幾秒鐘就會有一個線程運行來檢查代理的狀態,如果代理髮生故障,我想做一些郵件支持組和特定任務的特定任務。
網上的例子不夠詳細,不足以解釋如何達到上述目的。
有人已經做過這個,或者可以建議一個很好的方法來實現這一點?
感謝, Neeraj
我想創建一個java類,它的唯一目的是檢查ActiveMQ代理的狀態(或者連接到ActiveMQ代理,因爲停機可能定義爲客戶端失去網絡連接以及)。檢查ActiveMQ代理的狀態
所以基本上每隔幾秒鐘就會有一個線程運行來檢查代理的狀態,如果代理髮生故障,我想做一些郵件支持組和特定任務的特定任務。
網上的例子不夠詳細,不足以解釋如何達到上述目的。
有人已經做過這個,或者可以建議一個很好的方法來實現這一點?
感謝, Neeraj
發送測試消息給經紀人:
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
}
連接,發送郵件,如果您收到消息:一切都很好。如果不是......
這就是我所做的。另外我還做了一些其他的東西:
下面還將努力檢查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.
}
}
我需要同樣的問題的解決方案,這就是爲什麼我閱讀更多關於它並提出了一些測試。
發送測試消息(建議使用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());
玩得開心!
另外,您還可以在連接URI「failover:tcp:// host:port」中使用故障轉移。這會告訴客戶端自動重新連接,如果有套接字異常:http://activemq.apache.org/how-can-i-support-auto-reconnection.html –
即使代理關閉並且沒有響應,或者是否存在巨大的網絡延遲,catch塊是否會被執行? – Neeraj
當代理關閉時,createConnection調用失敗並且將捕獲異常。如果您只想檢查網絡延遲,則必須從遠程目標手動ping服務器。迴環設備永遠不會很慢。 – Laures