我收到来自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仍然会继续显示警告。
答案 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*));