JMX引发通知时引发的java.io.NotSerializableException

JMX引发通知时引发的java.io.NotSerializableException,java,notifications,jmx,jconsole,java-6,Java,Notifications,Jmx,Jconsole,Java 6,您好,最近我开始研究JMXbean实现 然后我发布下面的bean,运行JConsole,连接到bean,注册通知。但是,在发送通知时,我收到以下错误: 2012年4月13日下午5:31:26 ClientNotifForwarder NotifFetcher.fetchOneNotif 警告:未能反序列化通知:java.io.NotSerializableException:com.*.jmx.TaskMergeMBean 任何帮助都将是非常受欢迎的,我花了一天的大部分时间试图解决这个问题 谢

您好,最近我开始研究JMXbean实现

然后我发布下面的bean,运行JConsole,连接到bean,注册通知。但是,在发送通知时,我收到以下错误:

2012年4月13日下午5:31:26 ClientNotifForwarder NotifFetcher.fetchOneNotif 警告:未能反序列化通知:java.io.NotSerializableException:com.*.jmx.TaskMergeMBean

任何帮助都将是非常受欢迎的,我花了一天的大部分时间试图解决这个问题

谢谢, 乔纳森


彼得说的。但是

通知通常(但并非总是)必须序列化,因此使用this作为通知源往往会削弱this。(双关语)

因此,您需要完全确保this的实例是可序列化的(最好是有用的),或者更好的是,发送一个更简单的this表示形式,比如MBean的ObjectName。其目的是让接收者(或过滤器)能够确定通知的来源,因此我发现一致使用信息对象名确实有帮助

最后,JConsole在业务类上往往有点精简(默认情况下,我的意思是),因此如果您非常依赖JConsole,并且希望能够干净地查看所有通知,那么您需要确保在负载中只使用核心JDK类型

(或者使用OpenTypes(同样的事情)或者启用远程类加载(不值得这么麻烦)


//Nicholas是否执行可序列化的任务?
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);
  }
}