Статьи

Как контролировать сети ActiveMQ

Если вы используете ActiveMQ в распределенной конфигурации с использованием сети брокеров , вам, вероятно, интересны методы, доступные для мониторинга вашей сети. Обычно это подразумевает просмотр состояния сетевых мостов и генерацию событий при изменении состояния. В следующей версии 5.5 были сделаны некоторые улучшения в этой области, и здесь я постараюсь объяснить эту тему немного подробнее.

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

сеть

Мы видим, что у брокера 1 есть два сетевых моста:

  • Один создан дуплексным соединением от брокера 2
  • и один прямой к брокеру 3

Теперь давайте для начала посмотрим, что нам покажет JConsole.

JConsole1

JConsole2.png

Как видите, оба моста показаны в JConsole на вкладке « Сетевой мост ». Вы можете определить мосты, созданные удаленными дуплексными соединителями, имея шаблон имени соединителя, такой как duplex # x, а также атрибут CreatedByDuplex, установленный в значение true.

Подобную информацию вы можете получить сейчас в веб-консоли. Существует новая вкладка под названием Сеть (http: // localhost: 8161 / admin / network.jsp), которая даст вам следующее представление.

Веб-консоль

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

Инструменты хороши для большинства случаев, но что, если вы хотите контролировать свои сетевые мосты программно? Ну, первое, что вы можете сделать, это использовать JMX API для запроса мостов. Следующее приложение подключается к брокеру и перечисляет все его сетевые мосты.

public class Bridges {
    public static void main(String[] args) throws Exception {
        JMXServiceURL url = new JMXServiceURL(
                "service:jmx:rmi:///jndi/rmi://localhost:1099/jmxrmi");
        JMXConnector connector = JMXConnectorFactory.connect(url, null);
        connector.connect();
        MBeanServerConnection connection = connector.getMBeanServerConnection();
        ObjectName name = new ObjectName(
                "org.apache.activemq:BrokerName=static-broker1,Type=NetworkBridge,*");
        Set bridges = connection.queryNames(name, null);
        for (ObjectName bridgeName : bridges) {
            NetworkBridgeViewMBean view =
                    (NetworkBridgeViewMBean) MBeanServerInvocationHandler.newProxyInstance(
                            connection, bridgeName, NetworkBridgeViewMBean.class, true);
            System.out.println(”Bridge to ” + view.getRemoteBrokerName() 
                    + ” (” + view.getRemoteAddress() + “) ”
                    + ((view.isCreatedByDuplex() ? “- created by duplex” : “”)));
        }
    }
}

Так что если вы запустите его против брокера 1, вы получите что-то вроде

Bridge to static-broker3 (localhost/127.0.0.1:61617) 
Bridge to static-broker2 (/127.0.0.1:52776) - created by duplex

Вы можете видеть оба моста и указание, что мост к брокеру 2 создается удаленным дуплексом.

JMX API предоставит вам только статический снимок доступных мостов. Если вас интересуют уведомления, когда мосты останавливаются или запускаются, вы можете использовать рекомендательные сообщения . В следующем примере показано, как подписаться на соответствующую консультативную тему и получить интересующие события.

public class BridgeAdvisories implements MessageListener {
    public static void main(String[] args) throws Exception {
        ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory("tcp://localhost:61616");
        Connection conn = factory.createConnection();
        Session sess = conn.createSession(false, Session.AUTO_ACKNOWLEDGE);
        MessageConsumer consumer = sess.createConsumer(AdvisorySupport.getNetworkBridgeAdvisoryTopic());
        consumer.setMessageListener(new BridgeAdvisories());
        conn.start();
    }
    @Override
    public void onMessage(Message message) {
        try {
            BrokerInfo brokerInfo = (BrokerInfo) ((ActiveMQMessage) message).getDataStructure();
            boolean started = message.getBooleanProperty("started");
            if (started) {
                boolean createdByDuplex = message.getBooleanProperty("createdByDuplex");
                System.out.println("Network bridge to " + brokerInfo.getBrokerName() + " ("
                        + brokerInfo.getBrokerURL() + ") has been started " + (createdByDuplex ? "by duplex" : ""));
            } else {
                System.out.println("Network bridge to " + brokerInfo.getBrokerName() + " ("
                        + brokerInfo.getBrokerURL() + ") has been stopped");
            }
        } catch (JMSException e) {
            e.printStackTrace();
        }
    }
}

Если вы запустите это против нашего брокера 1 и запустите и остановите брокеров 2 и 3, вы можете ожидать, что результат будет похож на следующий.

Network bridge to static-broker3 (tcp://dejan-bosanacs-macbook-pro.local:61617) has been stopped
Network bridge to static-broker3 (tcp://dejan-bosanacs-macbook-pro.local:61617) has been started 
Network bridge to static-broker2 (tcp://dejan-bosanacs-macbook-pro.local:61618) has been stopped
Network bridge to static-broker2 (tcp://dejan-bosanacs-macbook-pro.local:61618) has been started by duplex

Таким образом, мы рассмотрели методы, которые вы можете использовать для мониторинга сетей брокера ActiveMQ, которые, я надеюсь, вы найдете полезными. Если вы хотите узнать больше об ActiveMQ (и связанных с ним технологиях), вы можете посетить один из онлайн-тренингов, организованных FuseSource