在 JMX 代理中将 Java 对象注册为 MBean
这是位于“管理”菜单下面的上下文操作(只有选定了 JMX 代理才能启用该操作)。您可以通过以下菜单来访问“管理”菜单:
- 顶级菜单
- 项目树节点的上下文菜单(右键单击选定的节点)
此操作的适用性
只有选定了 JMX 代理,才能应用此操作。JMX 代理类是使用 JMX 代理向导生成的类。
将使用以下操作所需的代码来更新 JMX 代理 init 方法:
- 实例化 Java 对象。此实例化是可选的。可以在代码的任何其他位置实例化要包装的 Java 对象。
- 在 javax.management.StandardMBean JMX 类实例中包装此 Java 对象。
- 命名(提供 MBean ObjectName)
- 注册(调用 MBeanServer 注册方法)
可以多次调用此操作来注册多个 Java 对象。
可以包装的 Java 类
并非所有的 Java 类都适于自动导出为 MBean。JMX 将对此进行一些检查。可以包装的类为:
- 至少实现一个接口的类。其中一个实现接口将被导出为管理接口。
- 与 JMX 标准 MBean 设计模式兼容的类。
使用“实例化并注册 MBean”操作
- 从“管理”菜单中,选择“实例化并注册 MBean...”。
- 将显示一个弹出式窗口。
- 选中“注册 StandardMBean 中包装的 Java 对象”复选框。
- 可以单击“浏览...”按钮,从当前的项目中选择一个 Java 类。也可以在文本字段中直接输入 Java 类名。
- 输入有效的 Java 类后,"ObjectName" 文本字段将处于活动状态。此时提供了缺省的 ObjectName。缺省 ObjectName 的计算方法如下:
- 通过 MBean 包名来派生域名。颠倒包名的顺序(例如,com.foo.bar ==> bar.foo.com)。如果包名是缺省包名,则会使用 JMX 缺省域。
- 名为 type 的单个键,将类名作为它的值(例如,class MyClass ==> type=MyClass)。
- 可以随意添加任何键/值对。缺省 ObjectName 计算非常适于命名“单一的”MBean。如果要注册多个相同类型的 Java 对象,您至少应该添加一个键来避免出现命名冲突。
- 现在,您可以从“构造函数”下拉列表中选择一个类构造函数。如果不想生成 Java 对象实例化,请选择“不生成对象实例化”项。
- 完成后,请单击“确定”。
- 将在编辑器中装入 JMX 代理源代码。
- 转至编辑方法以可视化生成的代码。
- 如果不需要更新生成的代码(没有为 Java 类构造函数提供任何对象引用以及参数),则可以立即编译、运行和可视化在代理中活动的 MBean。只需单击“运行”>“使用 JConsole 运行主项目...”,或者单击其关联的工具栏图标。将自动处理编译、执行和可视化操作。
更新生成的代码
在代理源文件中,请转至 init() 方法。
- 如果选定了“不生成对象实例化”,则需要提供您自己的类实例。在下面的提取中,在 StandardMBean 中包装了用于实现接口 AnInterfaceI 的类 MyClass。只需将 null 参数替换为您自己的对象引用。
getMBeanServer().registerMBean(
//TODO replace first parameter by your own MyClass object.
new javax.management.StandardMBean(null, I.class),
new ObjectName(":type=Test2"));
- 如果选定了需要某些参数的构造函数,则需要使用这些参数来更新生成的代码。为包装的 Java 类构造函数提供所需的参数。在下面的提取中,在 StandardMBean 中包装了用于实现接口 AnInterfaceI 的类 MyClass。MyClass 构造函数在构造时需要一个字符串。只需将 null 参数替换为字符串实现。
//TODO update MyClass(String) constructor parameters with valid values.
getMBeanServer().registerMBean(
new javax.management.StandardMBean(
new MyClass(null, AnInterfaceI.class),
new ObjectName(":type=MyClass"));