450 likes | 480 Views
Using RMI–IIOP in the Development of Distributed Applications. Dr. P.G.Sarang, President & CEO, sarang@abcom.com ABCOM Information Systems Private. Limited., Mumbai, India Ms Nita P. Sarang, Consultant, nita@indiawatch.org.in CMC Limited, Mumbai, India. RMI. R emote M ethod I nvocation
E N D
Using RMI–IIOP in the Development of Distributed Applications Dr. P.G.Sarang, President & CEO, sarang@abcom.com ABCOM Information Systems Private. Limited., Mumbai, India Ms Nita P. Sarang, Consultant, nita@indiawatch.org.in CMC Limited, Mumbai, India
RMI • Remote Method Invocation • Sun’s programming model for distributed objects • Java-based Using RMI-IIOP in the Development of Distributed Applications
RMI – merits/demerits • Advantages • Ease of programming • No complicated Interface Definition Language (IDL) to learn • Disadvantages • Uses Proprietary Protocol • Java Remote Method Protocol (JRMP) • No cross-language support Using RMI-IIOP in the Development of Distributed Applications
IIOP • Internet Inter-Operable Protocol • OMG’s programming model for distributed objects • Language neutral Using RMI-IIOP in the Development of Distributed Applications
IIOP – merits/demerits • Advantages • Interoperability • Between different ORB vendors • Between different languages • Disadvantages • Need to learn Interface Definition Language (IDL) • Complex Programming Using RMI-IIOP in the Development of Distributed Applications
RMI/IIOP Suitability • A pure RMI Java solution is suitable for new developments • For legacy applications, a CORBA wrapper is required for protecting existing investments Using RMI-IIOP in the Development of Distributed Applications
How do we achieve best of both worlds? RMI-IIOP Marriage
Proposal • A new protocol will confuse the user • RMI-IIOP Merger should protect investment in existing binaries • Reverse Mappings of RMI Interfaces to CORBA IDL • OMG is required to support Object by Value (OBV) Using RMI-IIOP in the Development of Distributed Applications
Requirements Existing RMI Clients and Servers both need upgrade to support IIOP Using RMI-IIOP in the Development of Distributed Applications
IIOP IIOP RMI-IIOP Scenario RMI-IIOP Client CORBA Server CORBA Client Using RMI-IIOP in the Development of Distributed Applications
Converting RMI to RMI-IIOP • Use PortableRemoteObject class instead of UnicastRemoteObject • Use Java Naming & Directory Interface (JNDI)instead of RMIRegistry • Use narrow method instead of Java Casts Using RMI-IIOP in the Development of Distributed Applications
Tools • New rmic compiler • Converts Java Interfaces to IDL • Generates IIOP Stubs and tie classes • New idlj compiler • Maps IDL to Java • Generates IIOP Stubs and tie classes Using RMI-IIOP in the Development of Distributed Applications
Migration • Converting existing RMI applications to RMI-IIOP applications. • Using Java-IDL to develop RMI-IIOP applications • Converting existing RMI Interfaces to CORBA IDL Using RMI-IIOP in the Development of Distributed Applications
Migration – Case 1 Existing RMI to RMI-IIOP
tie class RMI Java Server stub class rmic -iiop Complier IIOP RMI Java Client RMI to RMI-IIOP RMI Implementation Using RMI-IIOP in the Development of Distributed Applications
RMI to RMI-IIOP • Converting Server • Extend your implementation class from PortableRemoteObject rather than UnicastRemoteObject: • Use JNDI naming service rather than rmiregistry. • Converting Client • Use JNDI naming service to locate object • Use PortableRemoteObject.narrow() method rather than Java type cast. Using RMI-IIOP in the Development of Distributed Applications
Converting Server - Step 1 • Use PortableRemoteObject rather than UnicastRemoteObject import javax.rmi.PortableRemoteObject; … publicclassComputeImplextends PortableRemoteObject implementsCompute { … } Using RMI-IIOP in the Development of Distributed Applications
Converting Server - Step 2 • Use JNDI import javax.naming.*; … Replace Naming.rebind("//localhost/ComputeServer", obj); with java.util.Properties env = System.getProperties(); env.put ("java.naming.factory.initial", "com.sun.jndi.cosnaming.CNCtxFactory"); env.put ("java.naming.provider.url", "iiop://localhost:900"); Context ic = new InitialContext(env); ic.rebind ("//localhost/ComputeServer", obj); Using RMI-IIOP in the Development of Distributed Applications
Converting Client - Step 1 • Use JNDI Replace Object obj = Naming.lookup ("ComputeServer"); With java.util.Properties env = System.getProperties(); env.put ("java.naming.factory.initial", "com.sun.jndi.cosnaming.CNCtxFactory"); env.put ("java.naming.provider.url", "iiop://localhost:900"); Context ic = new InitialContext(env); Object obj = ic.lookup ("//localhost/ComputeServer"); Using RMI-IIOP in the Development of Distributed Applications
Converting Client - Step 2 • Replace java typecast with a call to narrow method Replace Compute TaxObj = (Compute)obj; With Compute TaxObj = (Compute)PortableRemoteObject.narrow (obj, Compute.class); Using RMI-IIOP in the Development of Distributed Applications
Compiling • Compile Java Source Files javac –d . *.java • Generate Stub and Tie Classes rmic –iiop <ImplClass> Example: rmic –iiop –d . com.abcom.tax.ComputeImpl Using RMI-IIOP in the Development of Distributed Applications
Running – Step 1 • Use JNDI Name Server rather than rmiregistry • Start the JNDI Name Server with following command start tnameserv (on Windows) tnameserv & (on unix) Using RMI-IIOP in the Development of Distributed Applications
Running – Step 2 • Start the Server java <RemoteServer> Example: java com.abcom.tax.ComputeImpl • Start the client Java <RemoteClient> Example: java Client Using RMI-IIOP in the Development of Distributed Applications
Migration – Case 2 IDL to RMI-IIOP
Steps • Write Java IDL • Use idlj compiler • Generates Java Mappings • Generates stubs and skeletons • Implement Server • Run Server and register with JNDI service • Develop Client and test Using RMI-IIOP in the Development of Distributed Applications
Example • Sample Java IDL module abcom{ interface tax { float CalculateTax(in float Amount); }; }; • idlj –fall sample.idl Using RMI-IIOP in the Development of Distributed Applications
Generated Files • Compiler generates following files in abcom Java package • _taxImplBase.java • _taxStub.java • tax.java • taxHelper.java • taxHolder.java • taxOperations.java Using RMI-IIOP in the Development of Distributed Applications
Migration – Case 3 Existing Java Interfaces to IDL
RMI to IDL • Use rmic to produce idl rmic –idl <ImplClass> • Map the generated idl to the desired language and provide implementation. Using RMI-IIOP in the Development of Distributed Applications
rmic -idl IDL IDL to C++ Impl. class C++ CORBA Server IIOP rmic -iiop RMI-IIOP Client RMI to IDL RMI Interface Using RMI-IIOP in the Development of Distributed Applications
Sample Java Remote Interface package com.abcom.tax; import java.rmi.Remote; import java.rmi.RemoteException; public interface Compute extends Remote { float SalesTax (float Amount) throws RemoteException; } Using RMI-IIOP in the Development of Distributed Applications
Generated IDL #include "orb.idl" … module com { module abcom { module tax { interface Compute { float SalesTax(in float arg0 ); }; … }; }; }; Using RMI-IIOP in the Development of Distributed Applications
Limitations • RMI supports passing objects by value in both parameters and method return types • CORBA 2.3 specification now supports Object by Value (OBV) • CORBA inout, out parameters not supported Using RMI-IIOP in the Development of Distributed Applications
OBV – Parameter Objects • Example public class Server extends PortableRemoteObject implements Compute { … public void printInvoice(Invoice inv)throws RemoteException { … } } • rmic –idl Server Using RMI-IIOP in the Development of Distributed Applications
Parameter Objects – Generated Files Following IDL files are generated • Compute.idl • Invoice.idl Using RMI-IIOP in the Development of Distributed Applications
Parameter Objects – Compute.idl valuetype Invoice; … interface Compute { void printInvoice(in ::Invoice arg0 ); }; Using RMI-IIOP in the Development of Distributed Applications
Parameter Objects – Invoice.idl valuetype Invoice { private long quantity; private long totalAmt; private ::CORBA::WStringValue itemDesc; factory create( ); }; Using RMI-IIOP in the Development of Distributed Applications
OBV – Returning objects • Example public class Server extends PortableRemoteObject implements Compute { … public Invoice computeInvoice()throws RemoteException { … } } • rmic –idl Server Using RMI-IIOP in the Development of Distributed Applications
Return Objects – Generated Files Following IDL files are generated. • Compute.idl • Invoice.idl Using RMI-IIOP in the Development of Distributed Applications
Return Objects – Compute.idl valuetype Invoice; … interface Compute { … ::Invoice computeInvoice( ); }; • Invoice.idl is same as in previous case Using RMI-IIOP in the Development of Distributed Applications
OBV – Dynamic Downloading • Remote classes for parameter objects can be dynamically downloaded using RMI class loading mechanism • Requires setting of java.rmi.server.codebase environment variable Using RMI-IIOP in the Development of Distributed Applications
Support for Objects by Value • Supported in CORBA 2.3 specification • Initial support by Java IDL ORB • Support now added by Major ORB vendors • Support defined for Java and C++ Using RMI-IIOP in the Development of Distributed Applications