0

こんにちは 最近、JMX Bean の実装に取り​​組み始めました。

次に、以下の Bean を公開し、JConsole を実行し、Bean に接続し、通知を登録します。ただし、通知が送信されると、次のエラーが発生します。

2012 年 4 月 13 日 5:31:26 PM ClientNotifForwarder NotifFetcher.fetchOneNotif 警告: 通知のデシリアライズに失敗しました: java.io.NotSerializableException: com。* .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);
  }
}
4

1 に答える 1

2

ピーターが言ったこと。だけでなく.....

通知は通常 (常にではありませんが) シリアル化する必要があるため、これを通知ソースとして使用すると、それにへこみ生じる傾向があります。(しゃれた意図)

そのため、 thisのインスタンスがシリアライズ可能であることを完全に確認する必要があります(できれば、シリアライズ可能であることが望ましい) か、MBean の ObjectName のように、これが何であるかのより単純な表現を送信することをお勧めします。その意図は、受信者 (またはフィルター) が通知の送信元を判別できるようにすることです。そのため、有益な ObjectNames を一貫して使用することが非常に役立つことがわかりました。

最後に、JConsole はビジネス クラスに対して少し薄い傾向があるため (つまり、デフォルトでは)、JConsole に大きく依存していて、すべての通知をきれいに表示できるようにしたい場合は、ペイロードのコア JDK タイプ。

(または、OpenTypes を使用するか (同じこと)、リモート クラスの読み込みを有効にします (手間をかける価値はありません))。

//ニコラス

于 2012-04-13T20:54:17.687 に答える