Как сделать JMX через JMS?

Мне нужно улучшить интерфейсы JMX распределенного Java-приложения. Причиной выбора JMX является простота представления данных. Эти распределенные приложения существуют на нескольких разных машинах, подключенных к серверу JMS (activemq 5.7) (который, в свою очередь, подключен к другому серверу JMS для соединения двух сетей, также activemq 5.7).

Что я хотел бы сделать, так это иметь доступ к удаленным интерфейсам JMX на отдельных серверах из любой точки сети JMS. Мне нужен полный доступ к JMX, как если бы доступ был через обычный интерфейс RMI. Это означает любой тип действия.

Я понимаю, что могу использовать lingo, чтобы заставить удаленные интерфейсы jmx общаться с сервер JMS, и оттуда мой мост должен разрешить мне доступ к ним (при условии, что он настроен правильно).

Хороший ли это подход? кто-нибудь пробовал жаргон для этой цели? Есть ли другие варианты, которые я, возможно, не нашел?

План Б может состоять в том, чтобы использовать модуль Apache Camel RMI, но похоже, что если жаргон будет вариантом, это будет гораздо больше plug & play, чем это.


person Miguel Coquet    schedule 19.12.2012    source источник
comment
ОБНОВЛЕНИЕ: я с большим успехом интегрировал жаргон. Теперь у меня есть каждый mbean JMX, открытый для сети JMS, поэтому все, что может подключиться к нему, имеет доступ к конечным точкам JMX в любой другой системе, а жаргон также предоставляет общедоступную тему, чтобы за событиями можно было следить, не потребляя сообщения для реальных обработчиков.   -  person Miguel Coquet    schedule 09.05.2013


Ответы (3)


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

С другой стороны, он предоставляет некоторые интересные возможности, такие как обнаружение, асинхронный вызов JMX и многоадресные операции JMX в стиле публикации/подписки, когда вы можете отправить один запрос на операцию и получить ответ от всех ваших MBeanServers.

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

  1. Прослушивание JMX-запросов: прослушиватель распаковывает запрос (который должен представлять собой кодировку вызов метода MBeanServerConnection). Используйте общую тему для вызовов в стиле pub/sub, возвращая упорядоченный результат в место назначения, указанное в JMSReplyTo в сообщении запроса. В противном случае вы можете выделить очередь для каждой JVM или выбрать уникальный идентификатор для каждой JVM и использовать селекторы сообщений.
  2. Если вы хотите реализовать уведомления JMX, вам потребуется реализовать прокси-сервер NotificationListener, который регистрирует нужные уведомления и пересылает их в указанное место назначения JMS после получения.

Вы также можете рассмотреть возможность реализации полноценного javax.management.remote, которая может более плавно интегрироваться в вашу среду благодаря соблюдению стандарта.

Я нашел проект OpenDMK очень полезным для расширения/реализации серверов и клиентов JMX. Библиотека предоставляет базовые строительные блоки для реализации стандартного решения удаленного взаимодействия JMX с использованием «настраиваемого» протокола. По сути, вы реализуете файл javax.management.remote.generic.MessageConnection, который служит механизмом транспорта и вызова. Все вызовы, ответы и обратные вызовы JMX сериализуются в экземпляры javax.management.remote.message.Message, и они все Serializable, поэтому у вас не должно возникнуть проблем с их записью и чтением из JMS ObjectMessages.

Несколько дополнительных преимуществ, которые вы получите от этого подхода:

  1. Если вы правильно настроите путь к классам, вы сможете подключиться к своим JVM с помощью любого стандартного инструмента JMX, такого как JConsole.
  2. OpenDMK также предоставляет возможность объединять MBeanServer, благодаря чему все ваши экземпляры MBeanServer появляются и становятся доступными через один центральный MBeanServer. Для этой функции требуется стандартная реализация удаленного взаимодействия JMX.
  3. OpenDMK также реализует интересный протокол обнаружения служб, и он поставляется в нескольких различных вариантах, включая необработанную многоадресную рассылку и подход «телефон-дом», который прекрасно сочетается с вашим протоколом JMS.

Я разместил обновленный проект OpenDMK здесь, если вам интересно.

Я реализую базовый клиент JMX для java-агентов, используя netty, и он дополнительно поддерживает асинхронные запросы JMX. Ответы доставляются через зарегистрированный прослушиватель, который похож на «обратный» MBeanServerConnection. Если это полезно, найдите источник здесь.

person Nicholas    schedule 19.12.2012
comment
Зависимость от центрального брокера не является для меня проблемой, поскольку рассматриваемые приложения уже существуют в рабочей среде и доказали свою работоспособность. Приложения в основном звонят домой, а не разговаривают друг с другом. Спасибо за предложение использовать OpenDMK. Я не придумал, когда искал ответы, но прежде чем писать что-то на этом уровне, я хотел бы полностью исключить возможность более простого уже доступного решения. - person Miguel Coquet; 20.12.2012

Jolokia (http://www.jolokia.org/) также является отличным проектом для удаленного доступа к JMX с использованием REST и JSON. Он делает это автоматически для вас. А также поддерживать пакетные операции. Предлагаю взглянуть на это.

Если вы используете JMX для получения статистики AMQ, тогда он предлагает подключаемый модуль, так что вы можете просто использовать обмен сообщениями JMS для получения статистики вместо JMX: http://activemq.apache.org/statisticsplugin.html

person Claus Ibsen    schedule 20.12.2012
comment
Спасибо за предложение. Это не решит мою проблему, так как я не уверен, что клиенты смогут открыть сетевой порт для входящего трафика, но я обязательно посмотрю на jolokia. Выглядит интересно. - person Miguel Coquet; 20.12.2012

Я бы использовал JMS для обнаружения URL-адресов интересующих меня серверов и с тех пор использовал простой JMX. Я не вижу преимущества в отправке каждого вызова RMI через JMS.

person Peter Lawrey    schedule 19.12.2012
comment
к сожалению, сетевой доступ к порту RMI не гарантируется. - person Miguel Coquet; 19.12.2012
comment
Я предполагаю, что у вас есть доступ через JMS, поскольку они уже должны это разрешить. - person Peter Lawrey; 19.12.2012
comment
у клиентов есть свободный исходящий доступ, моя проблема заключается в том, чтобы разрешить входящий RMI на клиентах (что не разрешено). - person Miguel Coquet; 20.12.2012