450 likes | 485 Views
Learn the advantages and disadvantages of using RMI and IIOP for distributed applications. Explore the marriage proposal of merging RMI and IIOP technologies for optimal results. Discover migration and conversion techniques for transitioning RMI applications to RMI-IIOP. Dive into practical tools and steps to achieve a seamless conversion process.
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