Spring JMX Notification: Предупреждение: не удалось десериализовать уведомление - PullRequest
1 голос
/ 26 мая 2011

Я получаю предупреждение от 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, и я отправляю уведомление от одного из моих методов обслуживания, который отображается как управляемый метод.Сначала я хочу проверить уведомление локально.

Я также вижу JConsole, отображающую компонент с узлами операций и уведомлений.Я подписываюсь на уведомление и запускаю клиентское приложение.Как только я запускаю свое клиентское приложение, 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

я сделал свой service & UserDataObject как сериализуемый .. Я также попытался передать строку в

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

, но все ещеJConsole продолжает отображать предупреждение.

Ответы [ 2 ]

0 голосов
/ 22 октября 2018

При отправке уведомления объект уведомления, который вы создаете, должен иметь свойство source, которое является экземпляром MBean/MXBean. Потому что для клиентов JMX (таких как JConsole и другие) только эти объекты известны и сериализуемы.

Итак, если вы отправляете это уведомление внутри своего экземпляра MBean, просто используйте this в качестве источника в вашем классе уведомлений.

 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*));
0 голосов
/ 28 мая 2011

Manish;

На основании предоставленного вами сообщения об ошибке JConsle не может десериализовать уведомление, поскольку оно содержит ссылку на экземпляр org.springframework.jmx.export.notification.ModelMBeanNotificationPublisher , который я предполагаю, является непреднамеренным.Можете ли вы опубликовать код, который отправляет уведомление?

...