Проверьте статус брокера ActiveMQ - PullRequest
10 голосов
/ 18 октября 2011

Я хочу создать класс java, единственная цель которого - проверить состояние брокера ActiveMQ (или подключение к брокеру ActiveMQ в случае сбоя может быть также определено как потеря клиентом сетевого подключения).

так что, в принципе, через каждые несколько секунд будет запускаться поток для проверки статуса брокера, и если этот брокер не работает, я хочу выполнить какую-то конкретную задачу по отправке почты в группу поддержки и тому подобное.

Примеры в Интернете недостаточно подробны, чтобы объяснить, как можно достичь вышеупомянутого.

Кто-то уже сделал это, или может предложить хороший способ сделать это ??

Спасибо, Neeraj

Ответы [ 3 ]

8 голосов
/ 02 декабря 2011

Следующее также будет работать, чтобы проверить, работает ли 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.
    }
}
7 голосов
/ 11 июня 2013

Мне нужно решение для того же вопроса, поэтому я прочитал об этом больше и сделал несколько тестов.

Отправка тестового сообщения (как предложено 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());

Веселись!

7 голосов
/ 18 октября 2011

Отправить тестовое сообщение брокеру:

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), которые являются важными индикаторами того, что что-то не так.
  • регулярно получает брокерастатистика из плагина статистики для мониторинга объема памяти сообщений и хранилища сообщений.
  • настройка очереди недоставленных сообщений, чтобы я знал, когда получатель отклонил сообщение.
...