RMI Applications
RMI Applications में सामान्यतया दो Separate Programs होते हैं, जिन्हें Server Program व Client Program कहा जाता है। इस प्रकार के Applications में एक Server Application कुछ Remote Objects Create करता है, उन्हें Accessible बनाने के लिए कुछ References Create करता है और इस बात का Wait करता है, कि कोई Client Software इन Remote Objects के Methods को Invoke करे।
इसी तरह से एक Client Application, Server Application के एक या एक से ज्यादा Remote Objects का Reference प्राप्त करता है और फिर उन Objects के Methods को Invoke करता है। RMI वह तरीका प्रदान करता है, जिसका प्रयोग करके Client व Server Communication करते हैं और एक दूसरे को Information Pass करते हैं। इस प्रकार के Applications को कई बार Distributed Object Application कहते हैं।
Distributed Applications वे Applications होते हैं, जो कई Host Computers पर Execute होते हैं। किसी एक Host पर Execute होने वाला Object किसी दूसरे Remote Host के Method को Invoke कर सकता है। Remotely Invoke किया जाने वाला Method किसी Local Computer को Requirement के आधार पर कोई मान Return कर सकता है। Distributed Application Develop करने के लिए कई Approaches हैं, जिनमें से किसी को भी Use किया जा सकता है। Internet व Web Distributed System के उदाहरण हैं, जिसे Client/Server Approach के आधार पर Develop किया गया है।
Data का Transfer होना किसी भी Distributed System का एक बहुत ही महत्वपूर्ण Process होता है। जावा में Message Passing के Default System के आधार पर एक ही Java Virtual Machine में Calling Object किसी दूसरे Called Object को Data Transfer करता है। एक Host से किसी दूसरे Host पर Data भेजने के लिए Remote Method Invocation (RMI) Approach को Use कर सकते हैं। RMI Objects को वह सुविधा प्रदान करता है, जिससे वे एक Host से दूसरे Host पर Messages भेज सकते हैं और Receive कर सकते हैं। RMI Objects को विभिन्न प्रकार के Hosts से सम्बंधित विभिन्न JVMs को Message भेजने व Receive करने की सुविधा देता है।
किसी भी Distributed Object Application की निम्न आवश्यकताएं होती हैं:
- Locate Remote Object
एक Application दो में से किसी एक तरीके का प्रयोग करके किसी Remote Object का Reference प्राप्त कर सकता है। एक Application अपने Remote Objects को rmiregistry की Simple Naming Facility का प्रयोग करके RMI से Register करवा सकता है अथवा एक Application Remote Objects के References को Return या Pass करने के लिए अपने Application में Normal Operation Define कर सकता है।
- Communicate with Remote Objects
Remote Objects के साथ की जाने वाली Communications की Details को RMI द्वारा Handle किया जाता है। Programmer के द`ष्टिकोण से देखें तो Remote Communication किसी Standard Java Method Invocation Process की तरह ही दिखाई देता है। यानी इस तकनीक में किसी Object के लिए किसी Remote Method को भी उसी तरह से Invoke किया जाता है, जिस तरह से किसी सामान्य Object के Method को Invoke किया जाता है।
- Local Class Bytecodes For Objects That Are Passed Around
RMI एक Caller Method को ये सुविधा Provide करता है, कि वह Remote Objects पर भी किसी Local Object को Pass कर सकता है। RMI किसी Object Code के साथ-साथ Object के Data को Load करने के लिए भी जरूरी Mechanism Provide करता है।
RMI Distributed Application एक Registry का प्रयोग करके किसी Remote Object का Reference प्राप्त करता है। Server Application Registry को Call करके Remote Object से एक नाम Associate या Bind करता है। Client Program Remote Objects के नाम को Server की इस Registry में खोजता है और नाम मिल जाने पर Server पर एक Method को Invoke करता है। जब जरूरत होती है तब किसी Object के लिए RMI System एक Existing Web Server को Use करके Class के Bytecodes को Server से Client में व Client से Server में Load करता है। इस प्रक्रिया को हम निम्न चित्र द्वारा भी समझ सकते हैं:

Advantage of Dynamic Code Loading
RMI की एक मुख्य विशेषता ये है कि यदि किसी Object की Class को Client की Virtual Machine पर Define ना किया गया हो, तो ये Client की Virtual Machine में Object की Class के Bytecodes को Download कर देता है।
यानी किसी Object की Class व Behavior, जो कि पहले किसी एक ही Virtual Machine पर उपलब्ध होते हैं, उन्हें RMI का प्रयोग करके दूसरे या Remote Virtual Machine पर भी Transmit किया जा सकता है।
RMI Objects को उनकी वास्तविक Class या Type के साथ Pass करता है, इसलिए उन Objects के Behaviors तब Change नहीं होते हैं, जब उन्हें दूसरी Machine पर भेजा जाता है। ये प्रक्रिया दूसरी Machine पर एक नया Type या Class उपलब्ध करवा देता है, यानी एक Application के Behaviors को Dynamically Extend कर देता है।
Remote Interfaces, Objects and Methods
किसी भी अन्य Application की तरह ही] Java RMI के आधार पर Develop किए जाने वाले एक Distributed Application में भी Interfaces व Classes का प्रयोग होता है। Interfaces में Methods को Declare किया जाता है और Classes में उन Methods को Implement किया जाता है, साथ ही कुछ Additional Methods को भी Define किया जाता है।
एक Distributed Application में कुछ ऐसे Methods Define किए जाते हैं, जिन्हें Remote Virtual machine पर Implement किया जाता है। वे Objects जिनमें ऐसे Methods होते हैं, जिन्हें दो अलग Virtual Machines पर Cross Form में Call किया जा सकता है, Remote Objects कहलाते हैं। एक Object उस समय Remote Object बन जाता है, जब उसमें Remote Interface को Implement किया जाता है। किसी Remote Object की निम्न Characteristics होती हैं:
- एक Remote Interface java.rmi.Remote Interface को Extend करता है।
- Interface का हर Method किसी भी अन्य Application Specific Exceptions के साथ java.rmi.RemoteException को भी उसके throws Class में Declare करता है।
जब किसी Remote Object को एक Virtual Machine से दूसरे Virtual Machine पर Pass किया जाता है, तब RMI इस Remote Object का एक Non-Remote Object की तुलना में अलग तरीके से Treat करता है। जब किसी Remote Object को एक Virtual Machine से किसी दूसरी Virtual machine में Pass किया जाता है, तब RMI किसी Remote Object के Implementation की Receiving Virtual Machine में एक Copy बनाने के बजाय Remote Object के लिए एक Remote Stub Pass करता है।
ये Stub, Remote Object के एक Local Representative या Proxy की तरह काम करता है और Caller के लिए Stub Remote Object का Remote Reference होता है। Caller, Remote Method को Local Stub पर Invoke करता है, जो कि Remote Object का एक Representative होता है।
Remote Object के लिए एक Stub उसी प्रकार के Remote Interfaces का Set Implement करता है, जिस प्रकार का Set Remote Object Implement करता है। ये प्रक्रिया Stub को ये सुविधा Provide करती है, कि वह Remote Object द्वारा Implement किए जाने वाले किसी भी Interface के रूप में Cast हो सकता है। हालांकि इसका मतलब ये भी है कि केवल वे ही Methods Call होने के लिए Receiving Virtual Machine पर उपलब्ध होते हैं, जिन्हें Remote Interface में Define किया गया होता है।
Creating Distributed Application Using RMI
जब हम RMI का प्रयोग करके कोई Distributed Application Develop करना चाहते हैं, तब हमें निम्नानुसार Steps Follow करने होते हैं:
Design and Implement the components of Distributed Application
सबसे पहले हमें हमारे Application के Architecture को तय करना होता है और ये तय करना होता है कि Application के कौनसे Components Local Objects होंगे और किन Components को Remotely Accessible बनाना होगा। इसका निर्णय हम निम्नानुसार ले सकते हैं:
- Defining The Remote Interfaces
एक Remote Interface उन Methods को Specify करता है, जिन्हें Client द्वारा Remotely Invoke किया जा सकता है। Design के इस हिस्से में उन Local Objects को Determine किया जाता है, जिन्हें इन Methods के लिए Parameter व Return Values के रूप में Use किया जाना होता है।
- Implementing The Remote Objects
Remote Objects को एक या एक से ज्यादा Remote Interfaces को Implement करना होता है। Remote Object की Class में अन्य Local Methods व (Local या Remote) Interfaces के Implementations हो सकते हैं। यदि किसी अन्य Local Class के Object को Parameter या Return Value के रूप में इन Methods में Use किया जा रहा है, तो उन्हें भी Implement करना जरूरी होता है।
- Implementing The Clients
वे Clients, जो कि Remote Objects को Use करते हैं, उन्हें Remote Interfaces को Define करने के बाद किसी भी समय Implement किए जा सकते हैं, फिर चाहे Remote Objects को Deploy ही क्यों ना कर दिया गया हो।
Compile Sources and Generate Stubs
ये एक 2-Step Process है। पहले Step में हम javac Compiler को Use करके उन Source File को Compile करते हैं, जिनमें Remote Interfaces] Server Classes व Client Classes को Implement किया गया होता है। दूसरे Step में हम rmic Compiler को Use करके Remote Objects के लिए Stubs Create करते हैं। RMI, Remote Objects की इस Stub Class को Client Program में एक Proxy की तरह Use करता है, ताकि Client किसी Particular Remote Object से Communicate कर सके।
Make Classes Network Accessible
इस Step में हम Remote Interfaces से Associated Class Files, Stubs व अन्य Class Files, जिन्हें Clients में Download करना होता है और जो Web Server द्वारा Accessible होते हैं, को Create करते हैं।
Start The Application
Application को Start करने के लिए RMI Remote Object Registry, Server व Client Programs को Start करना होता है।
चलिए, एक उदाहरण द्वारा हम इस पूरी प्रक्रिया को समझने की कोशिश करते हैं। हम जो Program यहां पर Create कर रहे हैं, इसके Server में एक Remote Object है, जो Clients से किसी Request को प्राप्त करता है, उसे Process करता है और Client को Result Return करता है।
Client की Request उस Virtual Machine पर Process होती है, जिस पर Server Run हो रहा है। इस Program की विशेषता ये है कि इस Program का Server जो काम करता है, उसे उसी Server में Define करने की जरूरत नहीं होती है।
किसी भी समय नए प्रकार के काम को Perform करने के लिए Coding को Create किया जा सकता है और उसे Server पर Run होने के लिए भेजा जा सकता है। किसी काम को पूरा करने के लिए हमें उस काम से सम्बंधित Class में किसी Particular Interface को Implement करना होता है।
किसी काम से सम्बंधित Class को Server पर भेजकर उस काम को पूरा करवाया जा सकता है, फिर चाहे उस काम को पूरा करने वाली Class को Server Class Create व Start करने के काफी बाद में Create किया गया हो। काम को पूरा करने के लिए जिन Codes की जरूरत होती है, उसे RMI System द्वारा Server Program में Download किया जा सकता है और फिर Server उस काम को उस Machine के Resources को Use करके Run करता है, जिस पर Server Run हो रहा होता है।
Random प्रकार के कामों को पूरा करने की सुविधा जावा Platform के Dynamic Nature के कारण प्राप्त होती है, जिसमें RMI का प्रयोग करके जावा के Platform को Network पर Extend किया जाता है। RMI विभिन्न प्रकार के Tasks को] बिना उस Class की Prior Knowledge के Dynamically Server के Virtual Machine में Load व Run करता है, जिसमें Task को Implement किया गया है। एक ऐसा Application जिसमें Codes को Dynamically Download करने की क्षमता हो, Behavior Based Application कहलाता है।
Creating RMI Server
हमारा Server, Client से जो की Requests को Accept करता है, उसे Process करता है और Client को Results Return करता है। इस Server में एक Interface व एक Class है। Interface में उन Methods को Define किया गया है, जिन्हें Client द्वारा Call किया जा सकता है।
Designing A Remote Interface
हम जो Server Create कर रहे हैं, उस Server का आधार एक Protocol है जो किसी Job को Server पर Submit करने, Server द्वारा उस Job को Run करने व Generate होने वाले Result को फिर से Client पर भेजने की सुविधा देता है। इस Protocol को एक Interface में Express किया गया है, जिसे Server व Server पर भेजे जाने वाले Object Support करता है। इस प्रक्रिया को हम निम्न चित्र द्वारा समझ सकते हैं:

हर Interface में एक Single Method होता है। Server का Interface Job को Process करता है व Generate होने वाले Result को Submit करने की सुविधा देता है। जबकि Client का Interface ये निश्चित करता है कि Server Submit किए गए Job को किस प्रकार से पूरा करता है। comput.Comput Interface Remotely Accessible Part को Define करता है, जो कि स्वयं Server होता है। इसका Code निम्नानुसार है:
// File Name : compute.java package compute; import java.rmi.Remote; import java.rmi.RemoteException; public interface Compute extends Remote { Object executeTask(Task t) throws RemoteException; }
java.rmi.Remote Interface को Implement करके, ये Interface स्वयं को इस बात के लिए Specify करता है कि इसके Method को किसी भी Virtual Machine द्वारा Call किया जा सकता है। इस Interface को Implement करने वाला कोई भी Object एक Remote Object बन जाता है।
Remote Interface के एक Member के रूप में Define किया गया executeTask Method एक Remote Method बन जाता है। इसलिए इस Method को ऐसा Define करना जरूरी हो जाता है, जो java.rmi.RemoteException को Throw कर सके।
इस Exception को RMI System द्वारा उस समय Throw किया जाता है, जब कोई Remote Method Call या तो Communication स्थापित ना कर पा, या फिर जब कोई Protocol Error Generate हो जाए।
RemoteException एक Checked Exception होता है, इसलिए कोई भी ऐसा Code जो इस Remote Method को Call करता है, उसे इस Exception को Catch करके Handle करना जरूरी होता है।
दूसरे Interface की जरूरत Server के लिए Task Type को Define करने के लिए होती है। इस Type का प्रयोग Compute Interface के executeTask() Method में Argument के रूप में किया जाता है। comput.Task Interface, Server व Perform किए जाने वाले Job के बीच Job को Start करने का तरीका प्रदान करता है। इसका Code निम्नानुसार है:
package compute; import java.io.Serializable; public interface Task extends Serializable { Object execute(); }
Task Interface execute() नाम का एक Single Method Define करता है। ये Method Return Value के रूप में एक Object Return करता है और इसमें कोई Parameter Pass नहीं किया जाता है।
ये Method किसी तरह का कोई Exception भी Throw नहीं करता है। क्योंकि ये Interface Remote Class को Inherit नहीं करता है, इसलिए इस Interface के इस Method के साथ java.rmi.RemoteException को इसके throws Clause के साथ List करने की जरूरत नहीं होती है।
Compute के executeTask() Method व Task के execute() Method के Return Value को Object Type का Declare किया गया है। इसका मतलब ये है कि जो भी Task किसी Primary Type के Value (int, float, char) को Return करना चाहता है, उसे इन मानों को उनके Equivalent Wrapper Class के Type (Integer, Float, Character) में Convert करके उसका Object Return करना होगा।
हमने Task Interface में java.io.Serializable Interface को Extend किया है। RMI Object Serialization Mechanism का प्रयोग करके Java Virtual Machines के बीच में Objects को By Value Transport कर सकता है, जो कि सामान्यतया By Reference ही Transport होते हैं।
Compute Object द्वारा विभिन्न प्रकार के उन Tasks को Run किया जा सकता है, जिनमें Task Type को Implement किया गया होता है। जो Classes इस Interface को Implement करती हैं, उनमें Computation से सम्बंधित विभिन्न प्रकार के अन्य Data व Methods हो सकते हैं, जो Computation के लिए जरूरी हैं।
RMI Technology
RMI इस Specification के आधार पर Develop किया गया है कि Local Objects व Remote Objects आपस में मिलकर Interoperate कर सकते हैं। Local Objects वे Objects होते हैं, जो Local Computer पर Execute होते हैं और Remote Objects वे Objects होते हैं, जो अन्य Host Machines पर Execute होते हैं।
Remote Registry Server (rmiregistry) एक ऐसा Software होता है, जो Server पर Run होता है। ये Remote Registry Server अन्य Hosts को ये सुविधा देता है, कि वे इसके Registered Objects को Remotely Access कर सकें। Remote Registry Server में एक Database होता है, जिसमें उन सभी Objects का नाम होता है, जो Remote Registry Server से Register होते हैं। Remote Registry Server को Start करने के लिए हमें Command Prompt पर “Start rmiregistry” Command लिखकर Enter करना होता है। ये Server Port 1099 पर Listens करता है।
वे Objects जिन्हें Remote Access के लिए Register किया जाना होता है, उन्हें RemoteInterface को Implement करना जरूरी होता है। ये Interface उन Objects को Identify करता है, जिन्हें Remotely Access किया जाना होता है। वह हर Method जिसे Remotely Invoke किया जाना होता है, उसे एक RemoteException Throw करना जरूरी होता है। इस Exception का प्रयोग उन Errors को Handle करने के लिए किया जाता है, जो Remote Method को Invoke करते समय Generate होते हैं।
जावा का RMI Approach Client/Server Framework के आधार पर Organized होता है। एक Local Object जो कि Remote Method को Invoke करता है, Client Object कहलाता है और वह Object जिसका Method Remotely Invoke होता है, Server Object कहलाता है। जावा का RMI Approach Stubs व Skeletons को Use करता है। Stub Client Computer का एक Local Object होता है, जो Remote Object के लिए एक Proxy की तरह काम करता है।
Stub Remote Object के Methods Provide करता है। Local Object Stub के Methods को इस तरह से Invoke करता है, जैसे कि वह Remote Object का ही Method हो। Stub इन Methods को Invoke करके Communicate करने के लिए एक Skeleton का प्रयोग करता है, जिसे Remote Host पर Implement किया जाता है।
Skeleton Client Computer का Proxy होता है, जो कि Remote Host Computer पर स्थित होता है। Stub व Skeleton एक Remote Reference Layer के Through Communicate करते हैं। ये Layer Stub को वह Capability Provide करता है, जिससे वह एक Transport Protocol का प्रयोग करके Skeleton से Communicate करता है। RMI TCP Protocol को Use करके Information को Transport करता है।
ये Article इस वेबसाईट पर Selling हेतु उपलब्ध EBook Java in Hindi से लिया गया है। इसलिए यदि ये Article आपके लिए उपयोगी रहा, तो निश्चित रूप से ये पुस्तक भी आपके लिए काफी उपयोगी साबित होगी।
Java Programming Language in Hindi | Page: 682 | Format: PDF