【问题标题】:JMX Notifications from MBean not listened/subscribed.What happens to the Notifications?来自 MBean 的 JMX 通知未侦听/订阅。通知会发生什么情况?
【发布时间】:2016-03-17 05:13:54
【问题描述】:

我在spring 4 框架中使用JMX MBeans。我处理来自 JMX mBean 的通知并将它们作为事件处理。

为了测试替代方法,我只是注释掉了通知处理部分。这意味着我的 JMX Mbean 继续发布通知,而我只是忽略它们。

附注: 我通过logstash 处理JMX 通知。为了测试我已经注释掉了Logstash配置

通知会发生什么?它将存储在哪里? 它会影响内存/在应用程序中堆积吗?

【问题讨论】:

    标签: notifications logstash jmx spring-jmx notification-listener


    【解决方案1】:

    JMX 通知是观察者模式的一种实现。使用这种模式,不会存储事件,因此不会出现内存问题。

    NotificationBroadcasterJavaDoc:

    当 MBean 发出通知时,它会考虑已使用 addNotificationListener 添加且随后未使用 removeNotificationListener 删除的每个侦听器。如果为该侦听器提供了过滤器,并且过滤器的 isNotificationEnabled 方法返回 false,则忽略该侦听器。否则,监听器的handleNotification 方法会随通知一起调用...

    另见

    监听器失效问题

    观察者模式链接指的是这个问题。需要明确的是,这个潜在的内存链接与您最初担心的(存储通知)不同。此内存泄漏是由未取消注册的侦听器引起的,例如 logstash 侦听器。如果一个监听器没有被注销,那么它可能不会被垃圾回收。

    如果您对此感到担忧,则需要确认注释掉 logstash 配置会阻止侦听器首先注册(它可能确实如此)。无论如何,这对您来说可能不是问题,因为它只是一个侦听器对象。您对通知的担忧更加严重,因为通知是不断创建的。

    【讨论】:

    • 谢谢。但是观察者模式的第一个链接表明 LapsedListenerProblem 可能导致内存泄漏。我只是困惑。
    • 我更新了我的答案来解决这个问题,@ArivazhaganJeganathan。
    【解决方案2】:

    在Java中sendNotification方法的代码流经过一些调试: 我的发现如下:

    Flow of sendNotification Method: 
    org.springframework.jmx.export.notification.ModelMBeanNotificationPublisher
    javax.management.modelmbean.RequiredModelMBean (Sendnotification)
    javax.management.NotificationBroadcasterSupport
    

    NotificationBroadcasterSupport 中的方法向仅注册的侦听器发送通知(基于类文件中的listenersList)。如果没有注册监听器,则跳过发送通知。

    因此,我假设/得出结论通知不会存储在任何地方。

    正如@DavidS 所建议的,如果我们在注册后未能 removeNotificationListener 并且不想接收通知,我们最终将让侦听器处理通知。内存泄漏的可能原因。

    【讨论】:

      猜你喜欢
      • 2015-08-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多