title: java.io.NotSerializableException raised when JMX raises notifications
body: <p>Hello recently I started working on a JMX bean implementation. </p>
  
  <p>I then publish the below bean, run JConsole, connect to the bean, register for notification. However when the notification is sent i get the following error:</p>
  
  <p><b><i>Apr 13, 2012 5:31:26 PM ClientNotifForwarder NotifFetcher.fetchOneNotif
  WARNING: Failed to deserialize a notification: java.io.NotSerializableException: com.<em>*</em>.jmx.TaskMergeMBean
  </i></b></p>
  
  <p>Any help will be most welcome, I've spent the better part of a day trying to figure this one out.</p>
  
  <p>Thanks,
  Jonathan</p>
  
  <pre><code>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);
    }
  }
  </code></pre>