2012-02-06 15 views
8

पर वसंत का उपयोग कर स्प्रिंग प्रलेखन से विभिन्न उदाहरण विन्यास के साथ ही इंटरनेट पर कुछ मंचों के बाद पंजीकरण, अपने आवेदन प्रसंग फ़ाइल लगता है:JMX MBean एक स्टैंडअलोन JVM

<beans> 
    <bean id="dH" class="abc.def.ghi.DH"> 
     <constructor-arg> 
      <value>0</value> 
     </constructor-arg> 
     <property name="num" value="100"/> 
    </bean> 
    <bean class="org.springframework.jmx.export.MBeanExporter" lazy-init="false"> 
      <property name="beans"> 
       <map> 
        <entry key="bean:name=dH1" value-ref="dH"/> 
       </map> 
      </property> 
    </bean> 
    <bean class="org.springframework.jmx.support.MBeanServerFactoryBean"/> 
</beans> 

मैं किसी भी कंटेनर के बिना इस चल रहा हूँ और सादे जेवीएम पर। मैं जेकोनोल के माध्यम से अपनी प्रक्रिया से जुड़ने में सक्षम हूं लेकिन एमबीन दिखाई नहीं देता है। हालांकि बीन को प्रोग्रामेटिक रूप से पंजीकृत करना सफलतापूर्वक खुलासा करता है।

MBeanServer mbeanServer = ManagementFactory.getPlatformMBeanServer(); 
DH dh = new DH(0); 
mbeanServer.registerMBean(dh, new ObjectName("bean:name=dH1")); 

मैंने सफलता के बिना स्प्रिंग कॉन्फ़िगरेशन के साथ खेलने का प्रयास किया है। मुझे लगता है कि बीन पहले से चल रहे एमबीन सर्वर पर पंजीकरण नहीं कर रहा है जो प्रबंधनफैक्टरी.getPlatformMBeanServer() से सुलभ था। इस मुद्दे पर कोई विचार?

उत्तर

11

एक 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) {} 
    } 
} 
+0

इसे बाहर निकालने के लिए धन्यवाद @ डैन। जब वसंत संदर्भ लोड होता है या यहां तक ​​कि डीएच को संदर्भ का उपयोग करके बनाया जाता है तो इंट्रोस्पेक्टर लाइन को भी निष्पादित नहीं किया जाता है। हालांकि मैन्युअल रूप से बीन को पंजीकृत करना एक ही पंक्ति को कॉल करता है। मुझे नहीं लगता कि वसंत इन विन्यासों के साथ बीन को पंजीकृत करने की कोशिश कर रहा है। कुछ गायब होना चाहिए ... –

+0

यह मेरे लिए स्प्रिंग 3.0.5 और एक साधारण जावाबीन का उपयोग कर एक संपत्ति गेटर/सेटर के साथ काम करता है; मैं विजुअलVM के साथ अपने सरल परीक्षण ऐप से कनेक्ट कर सकता हूं और परीक्षण एमबीन देख सकता हूं जो प्रदान की गई 'एमबीएनएक्सपोर्टर' बीन परिभाषा का उपयोग करके पंजीकृत था। अपने परिदृश्य को एक साधारण रूप में तोड़ने का प्रयास करें, इसे काम करने के लिए प्राप्त करें, फिर इसे अपने पास वापस ले जाएं और देखें कि आपकी समस्या कहां है। –

+0

स्प्रिंग 3.1.0 का उपयोग करके मैंने आपके प्रदत्त एक्सएमएल के साथ और बिना-comcom.man.management.jmxremote प्रोग्राम विकल्प के रूप में प्रयास किया, अभी भी कोई भाग्य नहीं है। मैं संदर्भ को निम्नलिखित तरीके से लोड कर रहा हूं: बीनफ़ैक्ट्री फैक्ट्री = नया एक्सएमएलबीन फैक्ट्री (नया क्लासपाथ रिसोर्स ("/ application-context.xml")); और फिर इच्छित एमबीन को लोड करना: factory.getBean (DH.class); मुझे पता है कि यह मूर्खतापूर्ण लगता है लेकिन क्या कोई तरीका है कि हम अपने पूर्ण एक्सएमएल और सरल प्रोग्राम संरचना से मेल खा सकते हैं? –

2

यह मुद्दा एमबीनसेवर फैक्ट्रीबीन के साथ है।

javadoc से:

डिफ़ॉल्ट रूप से, MBeanServerFactoryBean हमेशा एक नया MBeanServer भले ही एक पहले से ही चल रहा है पैदा करेगा। MBeanServerFactoryBean पहले चल रहे MBeanServer को खोजने का प्रयास करें, "detectExistingServerIfPossible" गुण का मान "सत्य" पर सेट करें।

इस config का प्रयास करें:

<bean class="org.springframework.jmx.support.MBeanServerFactoryBean"> 
    <property name="locateExistingServerIfPossible" value="true" /> 
</bean> 

================================ =================

निर्यातक सेम में MBeanServer निर्दिष्ट करने का प्रयास:

<bean class="org.springframework.jmx.export.MBeanExporter" lazy-init="false"> 
    <property name="beans"> 
     <map> 
       <entry key="bean:name=dH1" value-ref="dH" /> 
      </map> 
     </property> 
     <property name="server" ref="MBeanServer" /> 
</bean> 
<bean id="MBeanServer" class="org.springframework.jmx.support.MBeanServerFactoryBean"> 
    <property name="locateExistingServerIfPossible" value="true" /> 
</bean> 

=========== ================================= ============================

ठीक है, के जानवर बल दृष्टिकोण लेने के लिए और MBeanServer सीधे मंच प्राप्त करते हैं:

<bean class="org.springframework.jmx.export.MBeanExporter" lazy-init="false"> 
    <property name="beans"> 
     <map> 
       <entry key="bean:name=dH1" value-ref="dH" /> 
      </map> 
     </property> 
     <property name="server"> 
      <bean id="MBeanServer" class="java.lang.management.ManagementFactory" factory-method="getPlatformMBeanServer"/> 
     </property> 
</bean> 
+0

मैं पहले से ही यह @Nicholas की कोशिश की। भाग्य के बिना भी फिर से कोशिश की .. –

+0

उस के साथ कोई भाग्य भी .. –

+0

अन्य सुझाव @ निकोलस के लिए धन्यवाद। हालांकि दोनों ने कोशिश की, दोनों ने एमबीन भी पंजीकृत नहीं किया। –

संबंधित मुद्दे