2008-12-01 11 views
17

मैं वर्तमान में com.sun.management.jmxremote.* गुणों के साथ अपना जावा वीएम शुरू कर रहा हूं ताकि मैं प्रबंधन और निगरानी के लिए जेकोनसोल के माध्यम से इसे कनेक्ट कर सकूं। दुर्भाग्य से, यह मशीन पर सभी इंटरफेस (आईपी पते) पर सुनता है।जेएमएक्स को एक विशिष्ट इंटरफ़ेस से कैसे बांधें?

हमारे पर्यावरण में, अक्सर ऐसे मामले होते हैं जहां एक ही समय में एक से अधिक जावा वीएम चल रहे होते हैं। हालांकि जेएमएक्स को विभिन्न टीसीपी बंदरगाहों (com.sun.management.jmxremote.port का उपयोग करके) सुनना संभव है, इसके बजाय जेएमएक्स मानक जेएमएक्स पोर्ट का उपयोग करना अच्छा होगा और बस एक विशिष्ट आईपी पते (उन सभी के बजाए) से जुड़ना अच्छा होगा।

इससे यह पता लगाना आसान हो जाएगा कि हम किस वीएम को जेकोनोल के माध्यम से कनेक्ट कर रहे हैं (क्योंकि प्रत्येक वीएम प्रभावी ढंग से अपने स्वयं के आईपी पते का मालिक है)। क्या किसी ने यह पता लगाया है कि जेएमएक्स को एक आईपी पते या होस्टनाम पर कैसे सुनना है?

उत्तर

15

किसी और को इस के साथ अपने तंत्रिकाओं को खोने हो जाएगा ... 10 वर्षों के बाद, वे अंत में यह तय!

जावा 8u102 -Dcom.sun.management.jmxremote.host के बाद से चयनित आईपी

देखने को बांधता है: https://bugs.openjdk.java.net/browse/JDK-6425769

8

फर्नांडो ने पहले ही my blog post पर एक लिंक प्रदान किया है :) .. यह छोटा नहीं है। आपको अपना खुद का RMIServerSocketFactoryImpl प्रदान करना होगा जो वांछित पते पर सॉकेट बनाता है।

यदि आंतरिक/बाहरी इंटरफेस समस्या है और आपके पास स्थानीय फ़ायरवॉल की स्थानीय पहुंच सेटिंग आसान हो सकती है।

+0

धन्यवाद - मुझे नहीं पता था कि यह सरल या सुंदर होगा। :) –

-3

स्वीकृत उत्तर बहुत पुराना है। कुछ संकेत हैं कि जावा अब इसे सक्षम करने के लिए कुछ विकल्प प्रदान करता है। देखा उदाहरण के लिए मैं है

-Djava.rmi.server.hostname=<YOUR_IP> 

... के साथ-साथ ...

-Dcom.sun.management.jmxremote.host=<YOUR_IP> 

हालांकि, कम से कम अपने सिस्टम पर JDK 1.7 के तहत, इन कोई असर नहीं हैं - जेएमएक्स कनेक्टर अभी भी * से बांधता है। एक अद्यतन उत्तर (विशिष्ट लागू संस्करणों के साथ) की बहुत सराहना की जाएगी। यह होना चाहिए सरल होना चाहिए।

+0

इनमें से कोई भी बाध्य-पता नियंत्रित नहीं करता है। 'java.rmi.server.hostname' नया नहीं है, यह 17 साल के लिए रहा है, और मुझे संदेह है कि दूसरा भी नया है। – EJP

+0

मैंने नहीं कहा कि वे नए थे। मैंने कहा कि मैंने उन्हें देखा था और वे काम नहीं कर पाए। – sosiouxme

+0

मैं उम्मीद कर रहा था कि कुछ ऐसा तरीका था जो वास्तव में भयानक के बिना काम करता है। हालांकि कोई नहीं मिला है। – sosiouxme

0

मैंने यह कोशिश नहीं की है लेकिन इससे मदद मिल सकती है।

यहां मुख्य उपद्रव यह था कि मेजबान आईपी पता लगाने के लिए जेएमएक्स के लिए पता लगाने का कोई आसान तरीका नहीं है, यह हमेशा सभी इंटरफेस से जुड़ जाएगा। 'java.rmi.server.hostname' प्रॉपर्टी काम नहीं कर सका और मैं उसी होस्ट पर सभी अलग-अलग उदाहरणों के लिए अलग-अलग बंदरगाहों को नहीं चुनना चाहता था।

इसके अलावा, मैं अपने 0Mजटिलताओं के साथ अपनी खुद की RMIServerSocketFactory बनाना नहीं चाहता था, मैं मौजूदा कोड के लिए एक साधारण पैच के बाद था।

मैंने इस सर्वर सॉकेट बनाने के लिए डिफ़ॉल्ट जेवीएम आरएमआई सॉकेट फैक्टरी को पैच करके इसे ठीक कर दिया है। अब यह नई 'com.sun.management.jmxremote.host' संपत्ति का समर्थन करता है।

इसे काम करने के लिए, जावा कोड को सूर्य/आरएमआई/परिवहन/प्रॉक्सी/RMIDirectSocketFactory.java नामक फ़ाइल में सहेजें।

संकलित करें और इसे से jmx_patch.jar बनाएं और इसे टॉमकैट lib/ फ़ोल्डर में रखें।

फिर आप bin/setenv.sh में निम्न पंक्ति जोड़ने की जरूरत:

CLASSPATH = $ CLASSPATH: $ CATALINA_HOME/lib/mx_patch।जार

बिल्ला उदाहरण में इस विकल्प को जोड़ने शुरू

-Dcom.sun.management.jmxremote.host = 192.168.100.100 "

यह तो 192.168.100.100 संबोधित करने के लिए JMX सेवा बाँध जाएगा केवल। 2 अन्य यादृच्छिक RMI सुन बंदरगाहों अभी भी सभी इंटरफेस करने के लिए बाध्य होगा, लेकिन वह ठीक है के रूप में वे हमेशा वैसे भी एक मुक्त बंदरगाह लेने।

अब आप सब डिफ़ॉल्ट बंदरगाहों के साथ एक एकल मेजबान पर कई बिल्ला उदाहरणों चला सकते हैं बरकरार (उदाहरण के लिए जेएमएक्स के लिए 8080 उन सभी को)।

package sun.rmi.transport.proxy; 

import java.io.IOException; 
import java.net.InetAddress; 
import java.net.ServerSocket; 
import java.net.Socket; 
import java.rmi.server.RMISocketFactory; 

public class RMIDirectSocketFactory extends RMISocketFactory { 

    public Socket createSocket(String host, int port) throws IOException 
    { 
    return new Socket(host, port); 
    } 

    public ServerSocket createServerSocket(int port) throws IOException 
    { 
    String jmx_host = System.getProperty("com.sun.management.jmxremote.host"); 
    String jmx_port = System.getProperty("com.sun.management.jmxremote.port"); 

    // Allow JMX to bind to specific address 
    if (jmx_host != null && jmx_port != null && port != 0 && integer.toString(port).equals(jmx_port)) { 
    InetAddress[] inetAddresses = InetAddress.getAllByName(jmx_host); 
    if (inetAddresses.length > 0) { 
    return new ServerSocket(port, 50, inetAddresses[0]); 
    } 
} 

return new ServerSocket(port); 
    } 

}

0

मैं सिर्फ

की कोशिश की -Dcom.sun.management.jmxremote.host =

openjdk 1.8 के साथ

, और यह अच्छी तरह से काम करता है। यह उस addess (netstat के अनुसार) से बांधता है और सभी सही दिखता है (और काम करता है)।

+0

यह एक डुप्लिकेट उत्तर है - शायद आप मूल उत्तर में एक टिप्पणी जोड़ना चाहते हैं? – Richlv

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