2012-04-13 5 views
0

Hallo, vor kurzem habe ich angefangen, an einer JMX-Bean-Implementierung zu arbeiten.java.io.NotSerializableException ausgelöst, wenn JMX Benachrichtigungen auslöst

Ich veröffentliche dann die unten Bean, führen Sie JConsole, verbinden mit der Bohne, für die Benachrichtigung registrieren. Allerdings, wenn die Meldung bekomme ich folgende Fehler gesendet wird:

13. April 2012 17.31.26 ClientNotifForwarder NotifFetcher.fetchOneNotif ACHTUNG: Es konnte keine Meldung deserialisieren: java.io.NotSerializableException: com. * .jmx.TaskMergeMBean

Jede Hilfe wird sehr willkommen, ich habe den größten Teil des Tages damit verbracht, diese ein, um herauszufinden.

Danke, Jonathan

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

Wird 'TaskMergeMBean'' serializable' implementiert? –

Antwort

2

Was sagte Peter. Aber auch .....

Benachrichtigungen in der Regel (aber nicht immer) serialisiert werden, so mit diesem als die Benachrichtigung Quelle eine Delle in dass setzen neigt. (Wortspiel beabsichtigt)

Sie müssen also ganz sicher, dass die die Instanz von diese serializable ist (und vorzugsweise nutzbringend so) oder besser noch, senden eine einfachere Darstellung dessen, was diese ist, wie die ObjektName von die MBean. Die Absicht ist, dass der Empfänger (oder der Filter) in der Lage ist, die Quelle der Benachrichtigung zu bestimmen, daher finde ich, dass die konsistente Verwendung von informativen ObjectNames wirklich hilft.

Und schließlich, JConsole neigt dazu, ein wenig dünn in Business-Klassen (standardmäßig meine ich), so wenn Sie auf JConsole viel verlassen und Sie alle Ihre Benachrichtigungen sauber anzeigen möchten, müssen Sie machen sicher, dass Sie nur Core-JDK-Typen in Ihrer Payload verwenden.

(Oder verwenden Sie OpenTypes (gleiche Sache) oder aktivieren Sie das Laden von Remote-Klassen (nicht die Mühe wert)).

// Nicholas