Spring JMX通知:警告:无法反序列化通知

时间:2011-05-26 09:41:20

标签: spring jmx

我收到来自JConsole的警告消息,每次我的应用程序将通知发送到已注册的Spring MBean服务器时都会显示该消息。

我正在使用JMX和Spring 3.0。 我已将ServiceImpl类注册为MBean服务器。这是我的配置

<!-- MBean Server Factory -->
<bean id="mbeanServer" class="org.springframework.jmx.support.MBeanServerFactoryBean">
 <property name="locateExistingServerIfPossible" value="true"></property>
 <property name="agentId" value="MMAC-056_1306399012572"></property>
</bean>

<!-- this bean must not be lazily initialized if the exporting is to happen -->
<bean id="exporter" 
class="org.springframework.jmx.export.MBeanExporter" lazy-init="false">
<property name="beans">
<map>
   <entry key="bean:name=searchCampaignService" value-ref="campaignService" />
</map>
</property>
<property name="server" ref="mbeanServer"></property>
<property name="autodetect" value="true"></property>
<property name="registrationBehaviorName" value="REGISTRATION_REPLACE_EXISTING" />
<property name="assembler">
<bean class="org.springframework.jmx.export.assembler
                                               .MethodNameBasedMBeanInfoAssembler">
<property name="managedMethods">
    <value>searchCampaignById</value>
</property>
</bean>
</property>
<property name="notificationListenerMappings">
<map>
    <entry key="bean:name=searchCampaignService">
        <bean class="com....TestLoggingNotificationHandler" />
    </entry>
</map>
</property>

</bean>

我的serviceimpl类实现了NotificationPublisherAware接口&amp;我正在从我作为托管方法公开的一种服务方法发送通知。我想先在本地测试通知。

我还可以看到JConsole显示带有操作&amp;的bean。通知节点。 我订阅了通知&amp;运行我的客户应用程序 一旦我运行我的客户端应用程序,JConsole就会显示警告,说明

May 26, 2011 4:53:41 AM ClientNotifForwarder NotifFetcher.fetchOneNotif
WARNING: Failed to deserialize a notification: java.io.NotSerializableException:   

org.springframework.jmx.export.notification.ModelMBeanNotificationPublisher

我做了我的服务&amp; UserDataObject as serializable ..我也尝试将字符串传递给

notification.setUserData("Test notification"+ctr);

但JConsole仍然会继续显示警告。

2 个答案:

答案 0 :(得分:0)

和Manish;

根据您提供的错误消息,JConsle无法反序列化通知,因为它包含对 org.springframework.jmx.export.notification.ModelMBeanNotificationPublisher 实例的引用,我认为这是无意的。你可以发布发送通知的代码吗?

答案 1 :(得分:0)

在发送通知时,您创建的Notification对象应该具有MBean/MXBean实例的source属性。因为对于JMX客户端(例如JConsole和其他客户端),只有这些对象是已知的并且可序列化。

因此,如果要在MBean实例中发送此通知,只需在this作为Notification类中的源。

 public class NotificationManager extends 
       NotificationBroadcasterSupport implements 
             **NotificationManagerMXBean** {

 private AtomicInteger sequence = new AtomicInteger();

@Override
public void initialize() {
    this.sendNotification(new Notification("Initialization",
     **this**,sequence.incrementAndGet()));

}

使用以下类型的通知可以发送更详细的通知。您可以自己序列化对象,即JSon序列化。

this.sendNotification(
      new Notification("New", this
          , sequence.incrementAndGet(), 
            Instant.now().toEpochMilli(), myJSONSeiazedObject*));