Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何获取spring已向jmx注册的bean?_Java_Spring_Jmx_Spring Jmx - Fatal编程技术网

Java 如何获取spring已向jmx注册的bean?

Java 如何获取spring已向jmx注册的bean?,java,spring,jmx,spring-jmx,Java,Spring,Jmx,Spring Jmx,有没有办法获取spring在mbeanserver中注册的bean实例列表 我看到您可以在MBeanExporter上注册MBeanExporterListener,但这只能告诉我bean注册的对象名。我可以在某个地方使用该ObjectName来获取已注册对象的实例吗 我看到一种选择是将MBeanExporter子类化,但我真的不想这样做,除非我必须这样做 谢谢。我测试了一个示例代码,如下所示 // Get the Platform MBean Server MBeanServe

有没有办法获取spring在mbeanserver中注册的bean实例列表

我看到您可以在MBeanExporter上注册MBeanExporterListener,但这只能告诉我bean注册的对象名。我可以在某个地方使用该ObjectName来获取已注册对象的实例吗

我看到一种选择是将MBeanExporter子类化,但我真的不想这样做,除非我必须这样做


谢谢。

我测试了一个示例代码,如下所示

    // Get the Platform MBean Server
    MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
    // Construct the ObjectName for the MBean we will register
    ObjectName name = new ObjectName("com.example.mbeans:type=Hello");
    // Create the Hello World MBean
    Hello mbean = new Hello();
    // Register the Hello World MBean
    mbs.registerMBean(mbean, name);

    Set<ObjectInstance> instances = mbs.queryMBeans(name, null);
    ObjectInstance instance = (ObjectInstance) instances.toArray()[0];
    System.out.println("Class Name:t" + instance.getClassName());
    System.out.println("Object Name:t" + instance.getObjectName());

    // Wait forever
    System.out.println("Waiting forever...");
    Thread.sleep(Long.MAX_VALUE);
输出是

Class Name:tcom.example.mbeans.Hello
Object Name:tcom.example.mbeans:type=Hello
Waiting forever...
希望这有帮助

更新:

公共类ObjectInstance扩展对象实现可序列化
。ObjectInstance表示MBean的对象名及其类名。我们无法检索对对象本身的引用


我想在已注册的mbean上操作的唯一方法是使用JMS/RMI连接器(或HTML适配器)连接mbean服务器,使用与已注册的mbean相对应的JMX.newMBeanProxy创建mbean代理并调用该代理上的方法。

事实证明,您不能。如果要实现这一点,您必须将MBeanExporter子类化。

谢谢,但我要的是对象实例,而不是类名。一旦有了类名,您可以键入将对象强制转换为类名并使用它:Hello helloObject=(Hello)instance;除非我误解了你的意思,否则这在Java中是不可能的。经过一番研究,我得出了以下结论:JMXbyspec隐藏了对实际对象的实际引用。您无法通过JMX API获取对象引用(MBeanServer不会让您访问它)。这似乎是JMX的主要目标之一。我猜在已注册的MBean上操作的唯一方法是使用JMS/RMI连接器来获取MBean服务器的连接,使用对应于已注册mbean的JMX.newMBeanProxy创建mbean代理,并调用该代理上的方法。
Class Name:tcom.example.mbeans.Hello
Object Name:tcom.example.mbeans:type=Hello
Waiting forever...