एक MBeanServerFactory सेम को परिभाषित करने के अतिरिक्त (Nicholas के रूप में उनके answer में बताया गया है) का उपयोग कर ...
<bean class="org.springframework.jmx.support.MBeanServerFactoryBean">
<property name="locateExistingServerIfPossible" value="true" />
</bean>
... आप MBeanExporter बताने के लिए प्रबंधन करने की आवश्यकता:
यदि एक बीन जेएमएक्स प्रबंधन इंटरफेस में से एक को लागू करता है, तो एमबीएएनएक्सपोर्टर बस अपनी ऑटोडेटेक्शन प्रक्रिया के माध्यम से सर्वर के साथ एमबीन पंजीकृत कर सकता है।
यदि कोई बीन जेएमएक्स प्रबंधन इंटरफेस में से किसी एक को लागू नहीं करता है, तो एमबीएएनएक्सपोर्टर आपूर्ति किए गए एमबीएनएन्फोएस्सेबलर का उपयोग करके प्रबंधन जानकारी तैयार करेगा।
<bean class="org.springframework.jmx.export.MBeanExporter" lazy-init="false">
<property name="assembler">
<bean
class="org.springframework.jmx.export.assembler.MethodNameBasedMBeanInfoAssembler"
>
<property name="managedMethods">
<list>
<value>getNum</value>
</list>
</property>
</bean>
</property>
<property name="beans">
<map>
<entry key="bean:name=dH1" value-ref="dH"/>
</map>
</property>
</bean>
OpenJDK 7 को देखते हुए, 2 को अद्यतन, 21 DefaultMBeanServerInterceptor.java
स्रोत का निर्माण, लाइन 898 एक DynamicMBean
के लिए बनाता है:
अपने abc.def.ghi.DH
वर्ग मान लिया जाये कि किसी भी JMX इंटरफ़ेस को लागू नहीं करता है, को परिभाषित करने के लिए अपने MBeanExporter
के रूप में की कोशिश नियमित रूप से वस्तुओं:
DynamicMBean mbean = Introspector.makeDynamicMBean(object);
मैं इसे डिबग नहीं किया है, लेकिन मुझे यकीन है mbeanServer.registerMBean(dh, new ObjectName("bean:name=dH1"))
अंत में कहता है DefaultMBeanServerInterceptor.registerObject()
, जो आपके लिए DynamicMBean
बनाता है और आपके मानक JavaBean
गुणों के सेटर्स और गेटर्स को ठीक से पंजीकृत करता है।
यहां कुछ परीक्षण फ़ाइलें हैं जो स्प्रिंग फ्रेमवर्क 3.0.5 और ओरेकल हॉटस्पॉट जावा 1.6.0_24 का उपयोग करके काम करती हैं। अपना CLASSPATH
पर्यावरण चर सेट करने के बाद, बस javac *.java
और java Main
चलाएं और पंजीकृत एमबीएएन देखने के लिए चल रहे जावा एप्लिकेशन से कनेक्ट करने के लिए VisualVM (या समान एप्लिकेशन) का उपयोग करें।
ac.xml:
<?xml version="1.0" encoding="UTF-8"?>
<beans
xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd"
default-lazy-init="true"
>
<bean id="test" class="Test" />
<bean class="org.springframework.jmx.support.MBeanServerFactoryBean">
<property name="locateExistingServerIfPossible" value="true" />
</bean>
<bean class="org.springframework.jmx.export.MBeanExporter" lazy-init="false">
<property name="assembler">
<bean
class="org.springframework.jmx.export.assembler.MethodNameBasedMBeanInfoAssembler"
>
<property name="managedMethods">
<list>
<value>getVal</value>
<value>setVal</value>
</list>
</property>
</bean>
</property>
<property name="beans">
<map>
<entry key="bean:name=Test" value-ref="test"/>
</map>
</property>
</bean>
</beans>
Test.java:
public class Test {
private String val = "";
public String getVal() {
return val;
}
public void setVal(String v) {
val = v;
}
}
Main.java:
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Main {
public static void main(final String[] args) {
ApplicationContext ac = new ClassPathXmlApplicationContext("ac.xml");
try {
Thread.sleep(1000 * 60 * 5);
} catch (final Throwable t) {}
}
}
इसे बाहर निकालने के लिए धन्यवाद @ डैन। जब वसंत संदर्भ लोड होता है या यहां तक कि डीएच को संदर्भ का उपयोग करके बनाया जाता है तो इंट्रोस्पेक्टर लाइन को भी निष्पादित नहीं किया जाता है। हालांकि मैन्युअल रूप से बीन को पंजीकृत करना एक ही पंक्ति को कॉल करता है। मुझे नहीं लगता कि वसंत इन विन्यासों के साथ बीन को पंजीकृत करने की कोशिश कर रहा है। कुछ गायब होना चाहिए ... –
यह मेरे लिए स्प्रिंग 3.0.5 और एक साधारण जावाबीन का उपयोग कर एक संपत्ति गेटर/सेटर के साथ काम करता है; मैं विजुअलVM के साथ अपने सरल परीक्षण ऐप से कनेक्ट कर सकता हूं और परीक्षण एमबीन देख सकता हूं जो प्रदान की गई 'एमबीएनएक्सपोर्टर' बीन परिभाषा का उपयोग करके पंजीकृत था। अपने परिदृश्य को एक साधारण रूप में तोड़ने का प्रयास करें, इसे काम करने के लिए प्राप्त करें, फिर इसे अपने पास वापस ले जाएं और देखें कि आपकी समस्या कहां है। –
स्प्रिंग 3.1.0 का उपयोग करके मैंने आपके प्रदत्त एक्सएमएल के साथ और बिना-comcom.man.management.jmxremote प्रोग्राम विकल्प के रूप में प्रयास किया, अभी भी कोई भाग्य नहीं है। मैं संदर्भ को निम्नलिखित तरीके से लोड कर रहा हूं: बीनफ़ैक्ट्री फैक्ट्री = नया एक्सएमएलबीन फैक्ट्री (नया क्लासपाथ रिसोर्स ("/ application-context.xml")); और फिर इच्छित एमबीन को लोड करना: factory.getBean (DH.class); मुझे पता है कि यह मूर्खतापूर्ण लगता है लेकिन क्या कोई तरीका है कि हम अपने पूर्ण एक्सएमएल और सरल प्रोग्राम संरचना से मेल खा सकते हैं? –