दूरस्थ JMX कनेक्शन


96

मैं एक दूरस्थ मशीन पर चलने वाले जावा एप्लीकेशन के लिए एक JMX कनेक्शन खोलने की कोशिश कर रहा हूँ।

आवेदन JVM निम्नलिखित विकल्पों के साथ कॉन्फ़िगर किया गया है:

  • com.sun.management.jmxremote
  • com.sun.management.jmxremote.port = 1088
  • com.sun.management.jmxremote.authenticate = false
  • com.sun.management.jmxremote.ssl = false

मैं localhost:1088jconsole या jvisualvm का उपयोग करके कनेक्ट करने में सक्षम हूं। लेकिन मैं xxx.xxx.xxx.xxx:1088रिमोट मशीन से उपयोग करने से कनेक्ट करने में सक्षम नहीं हूं ।

सर्वर के बीच, या OS पर कोई फ़ायरवॉल नहीं है। लेकिन इस संभावना को खत्म करने के लिए मुझे telnet xxx.xxx.xxx.xxx 1088और मुझे लगता है कि यह कनेक्ट होता है, क्योंकि कंसोल स्क्रीन रिक्त हो जाती है।

दोनों सर्वर विंडोज सर्वर 2008 x64 हैं। 64-बिट JVM और 32-बिट के साथ कोशिश की, न तो काम।


1
शायद से संबंधित stackoverflow.com/questions/151238/...
tuler

यहाँ विस्तृत गाइड stackoverflow.com/a/11654322/99834
sorin

जवाबों:


117

यदि यह लिनक्स पर होता है तो समस्या यह होगी कि लोकलहोस्ट लूपबैक इंटरफ़ेस है , आपको अपने नेटवर्क इंटरफ़ेस से जुड़ने के लिए आवेदन करना होगा ।

आप नेटस्टैट का उपयोग यह पुष्टि करने के लिए कर सकते हैं कि यह अपेक्षित नेटवर्क इंटरफ़ेस से बंधा हुआ नहीं है।

आप इस प्रोग्राम को सिस्टम पैरामीटर के साथ इनवायरमेंट java.rmi.server.hostname="YOUR_IP"वैरिएबल के रूप में या उपयोग करके बना सकते हैं

java -Djava.rmi.server.hostname=YOUR_IP YOUR_APP

7
के बारे में मत भूलना hostname -i, जानकारी के लिए stackoverflow.com/a/11654322/99834 देखें।
सोरिन

काम किया! हमारे वातावरण में हम VMWare वर्चुअल मशीनों का उपयोग करते हैं। सर्वर VM पर था। VM को तैनात किया गया था ताकि उसके आंतरिक और बाहरी IP पते हों। हमने सर्वर जावा प्रक्रिया की शुरुआत की -Djava.rmi.server.hostname = <external-ip-address> के साथ।
buzz3791

होस्ट आईपी सेट करने या लोकलहोस्ट आईपी को बदलने के लिए यह लिंक उपयोगी होगा।
रेजा अमेरी

यहाँ मेरे दो सवाल हैं - 1) अगर कोई JMX के बजाय JMXMP का उपयोग करना चाहता है। उसके लिए विन्यास क्या होगा? और 2) क्या आरएमआई प्रोटोकॉल लोड किए बिना जेएमएक्स कनेक्शन बनाना संभव है?
कुमार वैभव

64

मैंने JMX को लोकलहोस्ट के बाहर से काम करने की कोशिश करने में एक दिन से अधिक समय लगाया है। ऐसा लगता है कि SUN / Oracle इस पर एक अच्छा प्रलेखन प्रदान करने में विफल रहा।

सुनिश्चित करें कि निम्न आदेश आपको एक वास्तविक आईपी या HOSTNAME लौटाता है। अगर यह 127.0.0.1, 127.0.1.1 या लोकलहोस्ट की तरह कुछ लौटाता है तो यह काम नहीं करेगा और आपको /etc/hostsफाइल अपडेट करनी होगी ।

hostname -i

यहाँ JMX को बाहर से भी सक्षम करने के लिए आवश्यक कमांड है

-Dcom.sun.management.jmxremote 
-Dcom.sun.management.jmxremote.authenticate=false 
-Dcom.sun.management.jmxremote.ssl=false 
-Dcom.sun.management.jmxremote.port=1100
-Djava.rmi.server.hostname=myserver.example.com

जैसा कि आपने माना था, myserver.example.com को क्या hostname -iरिटर्न मिलना चाहिए ।

जाहिर है, आपको यह सुनिश्चित करने की आवश्यकता है कि फ़ायरवॉल आपको ब्लॉक नहीं करता है, लेकिन मुझे लगभग यकीन है कि यह आपकी समस्या नहीं है, समस्या आखिरी पैरामीटर है जो दस्तावेज नहीं है।


जोड़ना -java.rmi.server.hostname = myserver.example.com ने किया ट्रिक! धन्यवाद!
जिम बेथनकोर्ट

मैंने इसके लिए JDK डॉक्स बग खोलने की स्वतंत्रता ली: Bugs.openjdk.java.net/browse/JDK-8066405
Klara

2
"सुनिश्चित करें कि निम्न कमांड आपको एक वास्तविक आईपी या HOSTNAME लौटाता है। यदि यह 127.0.0.1, 127.0.1.1 या लोकलहोस्ट की तरह कुछ लौटाता है तो यह काम नहीं करेगा और आपको फाइल / आदि / होस्ट्स को अपडेट करना होगा।" क्या?
पेड्रो

1
बस एक त्वरित, नहीं java.rmi.server.hostname=<Public DNS name from AWS EC2 console for the instance>। आशा है कि यह किसी की मदद करता है।
सोना

24

टॉमकैट और जावा 8 के साथ मेरे परीक्षण में, जेवीएम एमएमएक्स के लिए निर्दिष्ट एक के अलावा एक अल्पकालिक पोर्ट खोल रहा था। निम्नलिखित कोड ने मुझे ठीक किया; यदि आप अपने JMX क्लाइंट (जैसे VisualVM कनेक्ट नहीं कर रहे हैं) समस्या है, तो इसे आज़माएं ।

-Dcom.sun.management.jmxremote.port=8989
-Dcom.sun.management.jmxremote.rmi.port=8989

यह भी देखें कि जब JMX कॉन्फ़िगर किया गया है तो जावा 3 पोर्ट क्यों खोलता है?


12

http://blogs.oracle.com/jmxetc/entry/troubleshooting_connection_problems_in_jconsole

यदि आप एक सर्वर का उपयोग करने की कोशिश कर रहे हैं जो NAT के पीछे है - तो आपको विकल्प के साथ अपना सर्वर शुरू करना होगा

-Djava.rmi.server.hostname=<public/NAT address>

ताकि ग्राहक को भेजे जाने वाले आरएमआई स्टब्स में सर्वर का सार्वजनिक पता हो और इसे बाहर से ग्राहकों तक पहुँचाया जा सके।


8

यह कहता है कि आपकी समाप्ति बोली बहुत जल्दी आती है। यह अंतिम पैरामीटर के बाद होना चाहिए।

इस ट्रिक ने मेरे लिए काम किया।

मैंने कुछ दिलचस्प देखा: जब मैं निम्नलिखित कमांड लाइन का उपयोग करके अपना आवेदन शुरू करता हूं:

java -Dcom.sun.management.jmxremote.port=9999
     -Dcom.sun.management.jmxremote.authenticate=false
     -Dcom.sun.management.jmxremote.ssl=false

अगर मैं जोंको कंसोल का उपयोग करके किसी रिमोट मशीन से इस पोर्ट से कनेक्ट करने का प्रयास करता हूं, तो टीसीपी कनेक्शन सफल हो जाता है, कुछ डेटा का आदान-प्रदान रिमोट जोन्कोस और स्थानीय जेएमएक्स एजेंट के बीच किया जाता है जहां मेरी एमबीएन तैनात होती है, और फिर, जोंको कंसोल एक कनेक्टिंग संदेश प्रदर्शित करता है। मैंने एक वायरशार्क कैप्चर किया, और यह एजेंट और जोंको दोनों से आने वाले डेटा एक्सचेंज को दिखाता है।

इस प्रकार, यह एक नेटवर्क मुद्दा नहीं है, अगर मैं java.rmi.server.hostname सिस्टम प्रॉपर्टी के साथ या उसके बिना नेटस्टैट करता हूं, तो मेरे पास निम्नलिखित बाइंडिंग हैं:

 TCP    0.0.0.0:9999           0.0.0.0:0              LISTENING
 TCP    [::]:9999              [::]:0                 LISTENING

इसका अर्थ है कि दोनों स्थितियों में पोर्ट 9999 पर निर्मित सॉकेट किसी भी पते पर किसी भी होस्ट से कनेक्शन स्वीकार करता है।

मुझे लगता है कि इस प्रणाली की संपत्ति का उपयोग कहीं न कहीं कनेक्शन पर किया जाता है और इसकी तुलना एजेंट द्वारा उपयोग किए जाने वाले वास्तविक आईपी पते के साथ की जाती है। और अगर वे पते मेल नहीं खाते हैं, तो कनेक्शन विफल हो जाता है।

जंकसोल का उपयोग करके एक ही होस्ट से कनेक्ट करते समय मुझे यह समस्या नहीं थी, केवल वास्तविक भौतिक दूरस्थ होस्ट से। इसलिए, मुझे लगता है कि यह जांच केवल तभी की जाती है जब कनेक्शन "बाहर" से आ रहा हो।


"आपकी समाप्ति बोली बहुत जल्दी आती है" से आपका क्या तात्पर्य है? मेरे पास एक ही समस्या है, मैं देख रहा हूं कि टीसीपी कनेक्शन बनाया जा रहा है, लेकिन आखिरकार जोकन्सोल का दावा है कि यह कनेक्ट करने में विफल रहा।
tsuna

मुझे नहीं पता, अगर मुझे सही ढंग से याद है, तो कहीं एक उद्धरण खुला था और यह उद्धरण मापदंडों के अंत में नहीं था। शायद यह एक बैच स्क्रिप्ट में था, मुझे याद नहीं है। लेकिन मुझे यह स्वीकार करना चाहिए कि इस सवाल का कोई मतलब नहीं है ... शायद सवाल का संपादन किया गया है? प्रश्न के तहत कोई संपादित सूचना नहीं ... मुझे नहीं पता, मुझे क्षमा करें।
योहननमार्टिन्यू

6

वह चीज जो मेरे लिए काम करती थी, होस्टनाम को आईपी पर इंगित करने के लिए / etc / मेजबानों को सेट करना था और लूपबैक इंटरफेस पर नहीं और अपने आवेदन को पुनः आरंभ करने से।

बिल्ली / आदि / मेजबान

127.0.0.1      localhost.localdomain localhost
192.168.0.1    myservername

यह मेरा विन्यास है:

-Dcom.sun.management.jmxremote.port=1617 
-Dcom.sun.management.jmxremote.ssl=false 
-Dcom.sun.management.jmxremote.authenticate=false

5

बहुत बहुत धन्यवाद, यह इस तरह काम करता है:

java -Djava.rmi.server.hostname = xxx.xxx.xxx.xxx -xxx -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote .ssl = false -Dcom.sun.management.jmxremote.authenticate = false Dcom.sun.management.jmxremote.port = 25000 -जर myjar .jar



0

मेरे पास एक ही मुद्दा है और मैं किसी भी होस्टनाम को बदलता हूं जो स्थानीय होस्ट नाम को 0.0.0.0 से मेल खाता है, ऐसा करने के बाद मुझे लगता है कि यह काम करता है।


0

जेएमएक्स रिमोट को सक्षम करने के लिए, जेएवीए कमांड के साथ वीएम मापदंडों के नीचे से गुजरें।

    -Dcom.sun.management.jmxremote 
    -Dcom.sun.management.jmxremote.port=453
    -Dcom.sun.management.jmxremote.authenticate=false                               
    -Dcom.sun.management.jmxremote.ssl=false 
    -Djava.rmi.server.hostname=myDomain.in

1
क्या आप बता सकते हैं कि यह 0.0.0.0 के लिए बाध्यकारी क्यों है और एक विशिष्ट आईपी के लिए नहीं
बाबू जेम्स

0

यह कोशिश करो, मैंने डॉकटर कंटेनर के अंदर जेएमएक्स का उपयोग करने के लिए परीक्षण किया

-Dcom.sun.management.jmxremote = true -Djava.rmi.server.hostname = localhost -Dcom.sun.management.jmxremote.port = 16000 -Dcom.sun.management.jmxremote.rmi.port = 16000 -Dcom.sun .management.jmxremote.authenticate = false -Dcom.sun.management.jmxremote.ssl = false

फिर

$ जोंक लोकलहोस्ट: 16000


-11

3000 से अधिक बंदरगाहों का उपयोग करने का प्रयास करें।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.