5

カスタム属性で MXBean を作成しようとしていますが、javax.management.NotCompliantMBeanException が発生します IJmsDestinationMBean.getAttributes には、オープン型に変換できないパラメーターまたは戻り型があります

MXBean 属性は OpenType 互換でなければならないことを読みました。自分の属性をこのように機能させるにはどうすればよいですか? 以下のすべてのクラスは同じパッケージに含まれています。

class JmsDestinationMBean implements IJmsDestinationMBean{

  protected JmsDestinationAttributes attributes = new JmsDestinationAttributes();

  @Override
  public JmsDestinationAttributes getAttributes() {
    return this.attributes;
  }
}

@MXBean
interface IJmsDestinationMBean {
  JmsDestinationAttributes getAttributes()
}

class JmsDestinationAttributes {

  protected String name
  protected int messagesCurrentCount
  protected int consumersCurrentCount

  String getName() {
    this.name;
  }

  int getMessagesCurrentCount() {
    this.messagesCurrentCount;
  }

  int getConsumersCurrentCount() {
    this.consumersCurrentCount;
  }
}
4

1 に答える 1

10

問題はインターフェースIJmsDestinationMBeanです。オープン型ではない型JmsDestinationAttributesを返します。これを行うときに私が従う経験則は次のとおりです。

  • 実際に登録された MBean (複合型属性を持つ) はFooと呼ばれ、その管理インターフェースはFooMXBeanと呼ばれます。
  • 複合型 ( Fooの属性はBarと呼ばれ、 BarMBeanと呼ばれる管理インターフェースを持っています。この男は、オープン型または他の適切に公開された複合型ではない値を返すことはできません。

したがって、(この例では) 複合型をサポートするために「ホスト」MBean は MXBean である必要があり、複合型には<ClassName>MBeanというインターフェースが必要です。一方には M X Bean インターフェースがあり、もう一方には MBean インターフェースがあることに注意してください。

これが私の例です:

  • JMSDestinationは JMSDestinationMXBeanを実装します
  • JmsDestinationAttributesは JmsDestinationAttributesMBeanを実装します

...ルーズケース規格で申し訳ありません。オンザフライの例です。

ここに JMSDestination コードがあり、メインを作成して登録します。ユーザー名プロパティを使用して名前を指定しているだけです。

public class JmsDestination implements JmsDestinationMXBean {
    protected JmsDestinationAttributes attrs = new JmsDestinationAttributes(System.getProperty("user.name"));

    public JmsDestinationAttributes getAttributes() {
        return attrs;
    }

    public static void main(String[] args) {
        JmsDestination impl = new JmsDestination();
        try {
            ManagementFactory.getPlatformMBeanServer().registerMBean(impl, new ObjectName("org.jms.impl.test:name=" + impl.attrs.getName()));
            Thread.currentThread().join();
        } catch (Exception ex) {
            ex.printStackTrace(System.err);
        }
    }
}

JMSDestinationMXBean コード:

public interface JmsDestinationMXBean {
    public JmsDestinationAttributes getAttributes();
}

値に同じ名前と乱数を使用する JmsDestinationAttributes コード:

public class JmsDestinationAttributes implements JmsDestinationAttributesMBean {
    protected final String name;
    protected final Random random = new Random(System.currentTimeMillis());
    public JmsDestinationAttributes(String name) {
        this.name = name;
    }
    public String getName() {
        return name;
    }

    public int getMessagesCurrentCount() {
        return Math.abs(random.nextInt(100));
    }

    public int getConsumersCurrentCount() {
        return Math.abs(random.nextInt(10));
    }
}

.... および JmsDestinationAttributesMBean:

public interface JmsDestinationAttributesMBean {
    public String getName();
    public int getMessagesCurrentCount();
    public int getConsumersCurrentCount();
}

JConsole ビューは次のようになります。

MXBean の JConsole ビュー

MXBean の属性の JConsole ビューは次のようになります。

MXBean の属性の JConsole ビュー

わかる ?

于 2013-02-18T16:32:23.230 に答える