2012-04-13 3 views
0

Привет, недавно я начал работу над реализацией компонента JMX.java.io.NotSerializableException, когда JMX вызывает уведомления

Затем я публикую следующий компонент, запускаю JConsole, подключаюсь к компоненту, регистрирую для уведомления. Однако, когда уведомление отправляется я получаю следующее сообщение об ошибке:

13 апреля 2012 5:31:26 PM ClientNotifForwarder NotifFetcher.fetchOneNotif ВНИМАНИЯ: Не удался десериализация уведомления: java.io.NotSerializableException: ком. * .jmx.TaskMergeMBean

Любая помощь будет приветствовать, я провел большую часть дня, пытаясь понять это.

Спасибо, Джонатан

public class TaskMBean extends NotificationBroadcasterSupport implements DynamicMBean { 

    private final TaskStateChangedEventListener taskChangedListener; 

    public TaskMBean (DriverIf driver) { 
    taskChangedListener= new TaskStateChangedEventListener (this); 
    driver.registerMergeTaskStateChangedListener(mergeTaskChangedListener); 
    } 
    @Override 
    public MBeanNotificationInfo[] getNotificationInfo() { 
    String[] types = new String[] { AttributeChangeNotification.ATTRIBUTE_CHANGE }; 
    String name = AttributeChangeNotification.class.getName(); 
    String description = "An attribute of this MBean has changed"; 
    MBeanNotificationInfo info = new MBeanNotificationInfo(types, name,description); 
    return new MBeanNotificationInfo[] { info }; 
    } 

    @Override 
    public Object getAttribute(String attribute) throws AttributeNotFoundException,   MBeanException, 
     ReflectionException { 
    // TODO Auto-generated method stub 
    return null; 
    } 

    @Override 
    public void setAttribute(Attribute attribute) throws AttributeNotFoundException, 
     InvalidAttributeValueException, MBeanException, ReflectionException { 
    // TODO Auto-generated method stub 

    } 

    @Override 
    public AttributeList getAttributes(String[] attributes) { 
    // TODO Auto-generated method stub 
    return null; 
    } 

    @Override 
    public AttributeList setAttributes(AttributeList attributes) { 
    // TODO Auto-generated method stub 
    return null; 
    } 

    @Override 
    public Object invoke(String actionName, Object[] params, String[] signature) 
     throws MBeanException, ReflectionException { 
    // TODO Auto-generated method stub 
    return null; 
    } 

    @Override 
    public MBeanInfo getMBeanInfo() { 
    MBeanNotificationInfo haltInfo = 
     new MBeanNotificationInfo(
      new String[] { "NOTIFICATION_TYPE_MERGE_STATE_CHANGE" }, 
      Notification.class.getName(), "server halt on fatal error"); 
    MBeanNotificationInfo[] notifications = new MBeanNotificationInfo[] { haltInfo }; 
    return new OpenMBeanInfoSupport(XhiveMergeMBean.class.getName(), "", null, null, null, 
     notifications); 
    } 
} 

public class TaskStateChangedEventListener implements Serializable { 

    static final String NOTIFICATION_TYPE_MERGE_STATE_CHANGE = "com.xhive.lucene.merge"; 
    private final NotificationBroadcasterSupport broadcaster; 
    private int notificationSequence = 1; 

    public TaskStateChangedEventListener (NotificationBroadcasterSupport broadcaster) { 
    this.broadcaster = broadcaster; 
    } 

    @Override 
    public void notify(Object source) { 
    Notification n = 
     new AttributeChangeNotification(this, notificationSequence++, System.currentTimeMillis(), "", "", "int", 1, 2); 
    broadcaster.sendNotification(n); 
    } 
} 
+1

Выполняет 'TaskMergeMBean'' Serializable'? –

ответ

2

Что Петр сказал. Но также .....

Уведомления обычно (но не всегда) должны быть сериализовать, поэтому использование это в качестве источника уведомления, как правило, положить вмятину в , что. (Каламбур)

Так что вам нужно сделать полностью уверенным, что экземпляр это сериализуем (и желательно с пользой так) или еще лучше, отправить простое представление о том, что это является, как ObjectName из MBean. Цель заключается в том, чтобы получатель (или фильтр) мог определить источник уведомления, поэтому я нахожу, что на самом деле помогает последовательное использование информационных ObjectNames.

И, наконец, JConsole имеет тенденцию быть немного тонкой в ​​бизнес-классах (по умолчанию я имею в виду), поэтому, если вы много полагаетесь на JConsole, и вы хотите, чтобы вы могли просматривать все ваши уведомления чисто, вам нужно сделать убедитесь, что вы используете только основные типы JDK в своей полезной нагрузке.

(Или используйте OpenTypes (то же самое) или включите загрузку удаленного класса (не стоит хлопот)).

// Nicholas

 Смежные вопросы

  • Нет связанных вопросов^_^