2015-04-02 4 views
17

मुझे पता है कि वसंत स्वचालित रूप से जेएमएक्स बीन्स का पर्दाफाश करता है। मैं VisualVM का उपयोग करके इसे स्थानीय रूप से एक्सेस करने में सक्षम था।स्प्रिंग-बूट जेएमएक्स को दूरस्थ रूप से कैसे पहुंचे

हालांकि प्रोड पर मैं अपने जेएमएक्स बीन्स का उपयोग करके ऐप से दूरस्थ रूप से कैसे कनेक्ट कर सकता हूं? क्या कोई डिफॉल्ट पोर्ट है या क्या मुझे इसके अलावा कुछ भी परिभाषित करना चाहिए?

धन्यवाद, किरण।

उत्तर

24

डिफ़ॉल्ट JMX करके, स्थानीय रूप से स्वचालित रूप से पहुँचा जा सकता है तो jconsoleस्थानीय स्तर पर चल रहा है बंदरगाह संपर्क के बिना सब अपने स्थानीय जावा क्षुधा का पता लगाने जाएगा।

जेएमएक्स दूरस्थ रूप से के माध्यम से एक ऐप तक पहुंचने के लिए आपको एक आरएमआई रजिस्ट्री पोर्ट निर्दिष्ट करना होगा। यह जानने की बात यह है कि कनेक्ट होने पर, जेएमएक्स उस बंदरगाह पर शुरू होता है और तोपर डेटा कनेक्शन को यादृच्छिक उच्च पोर्ट पर स्थापित करता है, जो आपके बीच में फ़ायरवॉल है, तो यह एक बड़ी समस्या है। ("अरे sysadmins, बस सब कुछ खोलो, mkay?")।

विकल्प 1:: कमांड लाइन

-Dcom.sun.management.jmxremote.port=$JMX_REGISTRY_PORT 
-Dcom.sun.management.jmxremote.rmi.port=$RMI_SERVER_PORT 

आप स्प्रिंग उपयोग कर रहे हैं

ही बंदरगाह पर वापस कनेक्ट करने के लिए बाध्य करने के लिए JMX के रूप में आप की स्थापना की है, तो आप एक जोड़े विकल्प हैं बूट करें आप इसे अपने (appname).conf फ़ाइल में डाल सकते हैं जो आपके (appname).jar परिनियोजन के साथ रहता है।

विकल्प 2: बिलाव/Tomee विन्यास

कॉन्फ़िगर एक JmxRemoteLifecycleListener:

Maven जार:

<dependency> 
     <groupId>org.apache.tomcat</groupId> 
     <artifactId>tomcat-catalina-jmx-remote</artifactId> 
     <version>8.5.9</version> 
     <type>jar</type> 
    </dependency> 

अपने सर्वर को कॉन्फ़िगर करें।xml:

<Listener className="org.apache.catalina.mbeans.JmxRemoteLifecycleListener" 
     rmiRegistryPortPlatform="10001" rmiServerPortPlatform="10002" /> 

विकल्प 3: RMI होस्ट/पोर्ट और JNDI: कॉन्फ़िगर प्रोग्राम के रूप में

@Configuration 
public class ConfigureRMI { 

    @Value("${jmx.rmi.host:localhost}") 
    private String rmiHost; 

    @Value("${jmx.rmi.port:1099}") 
    private Integer rmiPort; 

    @Bean 
    public RmiRegistryFactoryBean rmiRegistry() { 
     final RmiRegistryFactoryBean rmiRegistryFactoryBean = new RmiRegistryFactoryBean(); 
     rmiRegistryFactoryBean.setPort(rmiPort); 
     rmiRegistryFactoryBean.setAlwaysCreate(true); 
     return rmiRegistryFactoryBean; 
    } 

    @Bean 
    @DependsOn("rmiRegistry") 
    public ConnectorServerFactoryBean connectorServerFactoryBean() throws Exception { 
     final ConnectorServerFactoryBean connectorServerFactoryBean = new ConnectorServerFactoryBean(); 
     connectorServerFactoryBean.setObjectName("connector:name=rmi"); 
     connectorServerFactoryBean.setServiceUrl(String.format("service:jmx:rmi://%s:%s/jndi/rmi://%s:%s/jmxrmi", rmiHost, rmiPort, rmiHost, rmiPort)); 
     return connectorServerFactoryBean; 
    } 
} 

चाल, तो आप देखेंगे, serviceUrl जिसमें आप JMX निर्दिष्ट दोनों है: आरएमआई मेजबान/बंदरगाह। यदि आप दोनों निर्दिष्ट करते हैं, तो आपको यादृच्छिक उच्च "समस्या" नहीं मिलेगी।

+1

क्या यह दृष्टिकोण नीचे 'JAVA_OPTS' विधि का उपयोग करके बहिष्कृत करता है? – raffian

0

हाँ यदि आप लिनक्स बॉक्स में चल रहे हैं तो आपको पोर्ट को आईपीटीबल्स, पोर्ट जेएमएक्स से कॉन्फ़िगर करना होगा।
साथ ही आपको क्लाइंट एम/सी पर आईपी पता भी सेट करने की आवश्यकता है ताकि केवल आपका एम/सी इसका उपयोग कर सके। JConsole/दृश्य वीएम में कनेक्ट करने के लिए निम्नलिखित का उपयोग

-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=<PORT_NUMBER> -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=<HOST'S_IP> 

:

17

निम्नलिखित JVM गुण "$ JAVA_OPTS" (अपने आवेदन में) में जोड़े

service:jmx:rmi:///jndi/rmi://<HOST'S_IP>:<PORT_NUMBER>/jmxrmi 

यह नहीं है सुरक्षा सक्षम करें, लेकिन आपको दूरस्थ सर्वर से कनेक्ट करने में मदद करेगा।

1

जावा 1.8.0_71 और वसंत बूट (1.3.3.RELEASE) पर एक परीक्षण दृष्टिकोण। मॉनिटर किए गए जेवीएम के लिए जेवीएम तर्कों के पैरामीटर नीचे दिए गए हैं।

-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=12348 -Dcom.sun.management.jmxremote.authenticate=true -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.rmi.port=12349 -Dcom.sun.management.jmxremote.password.file=/somewhere/jmxremote.password -Dcom.sun.management.jmxremote.access.file=/somewhere/jmx/jmxremote.access 

com.sun.management.jmxremote.port तय RMI रजिस्ट्री बंदरगाह को परिभाषित करने के लिए किया जाता है, और com.sun.management.jmxremote.rmi.port RMI बंदरगाह तय का उपयोग करने के लिए, लेकिन यादृच्छिक एक का उपयोग नहीं JVM निर्देश देने के लिए प्रयोग किया जाता है।

इसे सेट करके, मैं रिमोट होस्ट से जेवीएम क्लाइंट को मॉनीटर किए गए जेवीएम से फायरवॉल के माध्यम से कनेक्ट करने में सक्षम हूं, बस 12348 और 1234 9 पोर्ट खोल रहा हूं।

मैंने रिमोट मशीन पर java -jar cmdline-jmxclient-0.10.3.jar user:pwd hostip:12348 का उपयोग करके परीक्षण किया, जो नीचे उत्पादन उत्पन्न करता है (केवल प्रदर्शन के लिए छोटा)।

java.lang:type=Runtime 
java.lang:name=PS Scavenge,type=GarbageCollector 
Tomcat:J2EEApplication=none,J2EEServer=none,WebModule=//localhost/,j2eeType=Filter,name=requestContextFilter 
java.nio:name=mapped,type=BufferPool 
Tomcat:host=localhost,type=Host 
java.lang:name=Compressed Class Space,type=MemoryPool 
....... 

जार Here से डाउनलोड किया गया है।

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