Недавно я попал в мир JMX, пытаясь измерить наши приложения и выставлять некоторые операции через пользовательский JMXClient. Уже начата работа по определению того, как обрабатывать классы, не изменяя многое из нашего существующего кода. Я выполнил это с помощью реализации DynamicMBean. В частности, я создал набор аннотаций, которые мы украшаем нашими классами. Затем, когда объекты создаются (или инициализируются, если они используются как статические классы), мы регистрируем их с помощью нашего MBeanServer через статический класс, который создает динамический класс для класса и регистрирует его. Это прекрасно работает, когда мы просто используем JConsole или VisualVM. Мы можем выполнять операции и просматривать состояние полей, как мы должны быть в состоянии. Мой вопрос больше ориентирован на создание полу-реального времени JMXClient, такого как JConsole.Как подойти к опросу клиентов JMX
Самая большая проблема, с которой я столкнулся, заключается в том, как заставить JMXClient сообщать состояние полей как можно ближе к реальному времени, как я могу разумно получить, без необходимости модифицировать инструментальные библиотеки для push-уведомлений (например, в сеттере метод некоторого класса, установите поле, затем отпустите уведомление JMX). Мы хотим, чтобы классы были почти полностью не осведомлены о том, что они используются. Если вы проверяете JConsole при проверке атрибута, в нижней части экрана есть кнопка обновления, которая обновляет значения атрибута. Значение, которое он отображает для вас, - это значение, полученное при загрузке этого атрибута в представление, и никогда не будет изменяться без использования кнопки обновления. Я хочу, чтобы это произошло само по себе.
Я написал небольшой пользовательский интерфейс, который показывает некоторые данные о состояниях соединения и несколько полей на некоторых инструментальных классах. Чтобы эти значения отражали текущее состояние, у меня есть Thread, который вращается в фоновом режиме. Каждые две или около того поток пытается получить текущие значения интересующих меня полей, тогда пользовательский интерфейс обновляется в результате. Мне не очень нравится это решение, так как его сложно написать логику, которая обновляет основные модели. И даже сложнее обновить интерфейс так, чтобы не вызвать странные ошибки (используя Swing).
Я также мог бы написать дополнительный раздел JMXAgent на стороне нашего приложения, с единственным потоком, который проходит через список зарегистрированных DynamicMBeans, определяет, изменились ли значения их атрибутов, а затем выталкивает уведомление (с). Это приведет к перемещению логики уведомления из инструментальных библиотек, но все равно добавит больше нагрузки на приложения :(
Мне просто интересно, был ли кто-либо из вас в этом положении с JMX или чем-то еще, и может вести меня в правильном направлении для методологии проектирования для JMXClient или действительно любой другой совет, который мог бы сделать это решение более элегантным, чем я.
Любые предложения вы, ребята будут оценены.
FYI: Если вы рисуете значения в jconsole, он будет автоматически обновлять их каждые пару секунд. – Gray