我正在尝试使用自定义属性创建一个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;
}
}
答案 0 :(得分:8)
问题是界面 IJmsDestinationMBean 。它返回一个类型 JmsDestinationAttributes ,它不是一个开放类型。这是我在执行此操作时遵循的经验法则:
因此(对于此示例),“host”MBean需要是MXBean才能支持复杂类型,而复杂类型需要具有名为< ClassName> MBean 的接口。请注意,一个具有M X Bean接口,另一个具有MBean接口。
这是我的例子:
...为宽松的案例标准道歉。这是一个动态的例子。
这里是JMSDestination代码,用 main 来创建和注册。我只是使用用户名属性来提供名称。:
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视图如下所示:
有意义吗?