खोज…


JNDI के माध्यम से आर.एम.आई.

यह उदाहरण दिखाता है कि जेएमडीआई आरएमआई में कैसे काम करता है। इसकी दो भूमिकाएँ हैं:

  • सर्वर को RMI रजिस्ट्री को बाइंड / अनइंड / रिबाइंड एपीआई प्रदान करने के लिए
  • आरएमआई रजिस्ट्री को एक लुकअप / लिस्ट एपीआई के साथ क्लाइंट प्रदान करने के लिए।

RMI रजिस्ट्री RMI का हिस्सा है, JNDI का नहीं।

इसे सरल बनाने के लिए, हम RMI रजिस्ट्री बनाने के लिए java.rmi.registry.CreateRegistry() का उपयोग करेंगे।

  1. Server.java (JNDI सर्वर)

    package com.neohope.jndi.test;
    
    import javax.naming.Context;
    import javax.naming.InitialContext;
    import javax.naming.NamingException;
    import java.io.IOException;
    import java.rmi.RemoteException;
    import java.rmi.registry.LocateRegistry;
    import java.util.Hashtable;
    
    /**
     * JNDI Server
     * 1.create a registry on port 1234
     * 2.bind JNDI
     * 3.wait for connection
     * 4.clean up and end
     */
    public class Server {
        private static Registry registry;
        private static InitialContext ctx;
    
        public static void initJNDI() {
            try {
                registry = LocateRegistry.createRegistry(1234);
                final Hashtable jndiProperties = new Hashtable();
                jndiProperties.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.rmi.registry.RegistryContextFactory");
                jndiProperties.put(Context.PROVIDER_URL, "rmi://localhost:1234");
                ctx = new InitialContext(jndiProperties);
            } catch (NamingException e) {
                e.printStackTrace();
            } catch (RemoteException e) {
                e.printStackTrace();
            }
        }
    
        public static void bindJNDI(String name, Object obj) throws NamingException {
            ctx.bind(name, obj);
        }
    
        public static void unbindJNDI(String name) throws NamingException {
            ctx.unbind(name);
        }
    
        public static void unInitJNDI() throws NamingException {
            ctx.close();
        }
    
        public static void main(String[] args) throws NamingException, IOException {
            initJNDI();
            NMessage msg = new NMessage("Just A Message");
            bindJNDI("/neohope/jndi/test01", msg);
            System.in.read();
            unbindJNDI("/neohope/jndi/test01");
            unInitJNDI();
        }
    }
    
  2. Client.java (JNDI क्लाइंट)

    package com.neohope.jndi.test;
    
    import javax.naming.Context;
    import javax.naming.InitialContext;
    import javax.naming.NamingException;
    import java.util.Hashtable;
    
    /**
     * 1.init context
     * 2.lookup registry for the service
     * 3.use the service
     * 4.end
     */
    public class Client {
        public static void main(String[] args) throws NamingException {
            final Hashtable jndiProperties = new Hashtable();
            jndiProperties.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.rmi.registry.RegistryContextFactory");
            jndiProperties.put(Context.PROVIDER_URL, "rmi://localhost:1234");
    
            InitialContext ctx = new InitialContext(jndiProperties);
            NMessage msg = (NeoMessage) ctx.lookup("/neohope/jndi/test01");
            System.out.println(msg.message);
            ctx.close();
        }
    }
    
  3. NMessage.java (RMI सर्वर वर्ग)

    package com.neohope.jndi.test;
    
    import java.io.Serializable;
    import java.rmi.Remote;
    
    /**
     * NMessage
     * RMI server class
     * must implements Remote and Serializable 
     */
    public class NMessage implements Remote, Serializable {
        public String message = "";
    
        public NMessage(String message)
        {
            this.message = message;
        }
    }
    

बाज़ को कैसे चलाना है:

  1. सर्वर बनाएं और शुरू करें
  2. क्लाइंट बनाएं और शुरू करें

परिचय कराना

जेएनडीआई मॉडल

जावा नामकरण और निर्देशिका इंटरफ़ेस (JNDI) एक निर्देशिका सेवा के लिए एक जावा एपीआई है जो जावा सॉफ्टवेयर क्लाइंट को नाम के माध्यम से डेटा और ऑब्जेक्ट्स को खोजने और देखने की अनुमति देता है। यह किसी भी विशिष्ट नामकरण या निर्देशिका सेवा कार्यान्वयन से स्वतंत्र होने के लिए डिज़ाइन किया गया है।

JNDI आर्किटेक्चर में एक API (एप्लिकेशन प्रोग्रामिंग इंटरफ़ेस) और एक SPI (सर्विस प्रोवाइडर इंटरफ़ेस) होते हैं। जावा एप्लिकेशन विभिन्न नामकरण और निर्देशिका सेवाओं तक पहुंचने के लिए इस एपीआई का उपयोग करते हैं। SPI विभिन्न प्रकार के नामकरण और निर्देशिका सेवाओं को पारदर्शी रूप से प्लग करने में सक्षम बनाता है, जिससे जावा एप्लिकेशन को JNDI तकनीक के एपीआई का उपयोग करके अपनी सेवाओं का उपयोग करने की अनुमति मिलती है।

जैसा कि आप ऊपर चित्र बना सकते हैं, JNDI LDAP, DNS, NIS, NDS, RMI और CORBA का समर्थन करता है। बेशक, आप इसे बढ़ा सकते हैं।

यह काम किस प्रकार करता है

इस उदाहरण में, जावा आरएमआई एक नेटवर्क में वस्तुओं को देखने के लिए जेएनडीआई एपीआई का उपयोग करता है। यदि आप किसी वस्तु को देखना चाहते हैं, तो आपको कम से कम दो जानकारी चाहिए:

  • वस्तु कहां मिलेगी

RMI रजिस्ट्री नाम बाइंडिंग का प्रबंधन करती है, यह आपको बताती है कि ऑब्जेक्ट को कहां खोजना है।

  • वस्तु का नाम

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

क्रमशः

  1. पहले आपको एक रजिस्ट्री की आवश्यकता होती है, जो नाम बंधन का प्रबंधन करती है। इस उदाहरण में, हम java.rmi.registry.LocateRegistry उपयोग करते हैं।

    //This will start a registry on localhost, port 1234
    registry = LocateRegistry.createRegistry(1234);
    
  2. क्लाइंट और सर्वर दोनों को एक संदर्भ की आवश्यकता होती है। सर्वर नाम और वस्तु को बांधने के लिए प्रसंग का उपयोग करता है। क्लाइंट नाम देखने और ऑब्जेक्ट प्राप्त करने के लिए प्रसंग का उपयोग करता है।

    //We use com.sun.jndi.rmi.registry.RegistryContextFactory as the InitialContextFactory
    final Hashtable jndiProperties = new Hashtable();
    jndiProperties.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.rmi.registry.RegistryContextFactory");
    //the registry usrl is "rmi://localhost:1234"
    jndiProperties.put(Context.PROVIDER_URL, "rmi://localhost:1234");
    InitialContext ctx = new InitialContext(jndiProperties);
    
  3. सर्वर नाम और ऑब्जेक्ट को बांधता है

    //The jndi name is "/neohope/jndi/test01"
    bindJNDI("/neohope/jndi/test01", msg);
    
  4. मुवक्किल "/ नेहोपे / jndi / test01" नाम से वस्तु को देखता है।

    //look up the object by name "java:com/neohope/jndi/test01"
    NeoMessage msg = (NeoMessage) ctx.lookup("/neohope/jndi/test01");
    
  5. अब क्लाइंट ऑब्जेक्ट का उपयोग कर सकता है

  6. जब सर्वर समाप्त हो रहा है, तो सफाई करने की आवश्यकता है।

    ctx.unbind("/neohope/jndi/test01");
    ctx.close();
    


Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow