问题是接口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 视图如下所示:
有道理 ?