Уведомления JMX от MBean не прослушиваются / не подписываются. Что происходит с уведомлениями?
Я использую JMX MBeans
в spring 4
фреймворк. Я обрабатываю уведомления от JMX mBean и обрабатываю их как события.
Для тестирования альтернативного подхода я просто закомментировал часть обработки уведомлений. Это означает, что мой JMX Mbean продолжает публиковать уведомления, и я просто игнорирую их.
PS: я обрабатываю уведомления JMX через logstash
, Для тестирования я закомментировал Logstash
конфигурация
Что происходит с уведомлением? Где это будет храниться? Повлияет ли это на память / накапливается в приложении?
2 ответа
Уведомления JMX являются реализацией шаблона наблюдателя. С этим шаблоном события не сохраняются, поэтому нет проблем с памятью.
NotificationBroadcaster
JavaDoc:
Когда MBean отправляет уведомление, он рассматривает каждого прослушивателя, который был добавлен с помощью addNotificationListener и не был впоследствии удален с помощью removeNotificationListener. Если для этого прослушивателя был предоставлен фильтр, и если метод фильтра isNotificationEnabled возвращает значение false, прослушиватель игнорируется. В противном случае метод handleNotification слушателя вызывается с уведомлением...
Смотрите также
- https://en.m.wikipedia.org/wiki/Observer_pattern
- https://docs.oracle.com/javase/7/docs/api/javax/management/NotificationBroadcaster.html
- Java Management Extensions (JMX) - лучшие практики
Проблема с прослушиванием
Ссылка на шаблон наблюдателя относится к этой проблеме. Чтобы было ясно, эта потенциальная ссылка на память отличается от той, о которой вы беспокоились изначально (хранение уведомлений). Эта утечка памяти вызвана тем, что слушатели не были отменены, например, слушатель logstash. Если слушатель не отменен, то он не может быть сборщиком мусора.
Если вы обеспокоены этим, вам необходимо подтвердить, что комментирование конфигурации logstash не позволяет слушателю вообще когда-либо регистрироваться (это возможно). Несмотря на это, это, вероятно, не проблема для вас, потому что это всего лишь один объект слушателя. Ваше беспокойство об уведомлениях было более серьезным, потому что уведомления постоянно создаются.
После некоторой отладки потока кода sendNotification
Метод на Java: мои выводы ниже:
Flow of sendNotification Method:
org.springframework.jmx.export.notification.ModelMBeanNotificationPublisher
javax.management.modelmbean.RequiredModelMBean (Sendnotification)
javax.management.NotificationBroadcasterSupport
Метод в NotificationBroadcasterSupport
отправляет уведомления слушателям, которые зарегистрированы только (на основе listenersList
в файле класса). Если ни один из слушателей не зарегистрирован, он пропускает отправку уведомлений.
Отсюда я предполагаю / делаю вывод, что уведомления нигде не хранятся.
Как предложил @DavidS, если мы не сможем удалить NotificationListener после регистрации и не захотим получать уведомления, мы в конечном итоге обработаем уведомления слушателями. Возможная причина утечки памяти.