Java RMI & CORBA: поняття та відомості
Завантажити презентаціюПрезентація по слайдам:
Зміст J2EE. Підтримка CORBA. Технологія Java IDL. Технологія Java RMI/IIOP Сумісність RMI/IIOP - та CORBA-проектів Java RMI & CORBA
J2EE. Підтримка CORBA Технологія Java IDL По суті надається можливість розробляти CORBA-проекти: наявність сукупності класів, що підтримують основні засади технології CORBA; наявність компілятора idlj, який дозволяє за IDL-файлом отримувати Java-класи для CORBA-проекту, зокрема, отримувати класи для проксі-об'єктів CORBA; наявність служби іменування (orbd), що відповідає CORBA-специфікації. (Окрім orbd підтримується також “застаріла” служба іменування tnameserv). Технологія Java RMI/IIOP rmic -idl ... Архітектура RMI Java RMI & CORBA
Платформа J2EE. Механізми та служби Взаємодія з клієнтом: JSP (Java Server Pages). Java сервлети. Web-служби. Бізнес-логіка: Enterprise Java Beans (EJB). (Специфікація EJB є серцевиною платформи J2EE). Базові служби (інтерфейси API): JNDI JTS JPA JTA JDBC RMI RMI/IIOP Java IDL JCA JMS JavaMail JAF У J2EE пропонується широкий спектр інтерфейсів API для уніфікованого доступу до сервісів (служб) та програм, реалізованих сторонніми організаціями Java RMI & CORBA
Сумісність RMI/IIOP- та CORBA-проектів “Сумісність” RMI/IIOP- та CORBA-проектів, що є “відповідними” один одному: термін “сумісність” вжито тут у розумінні можливої взаємодії типу клієнт-сервер: поняття “відповідних” проектів у даному випадку ґрунтується на специфічних правилах трансляції, а саме на правилах трансляції за схемами Java –> IDL та IDL–> Java, реалізованих JDK-утилітами rmic та idlj: а) (rmic -idl ...) : Java –> IDL; б) (idlj ... ) : IDL –> Java. RMI/IIOP - клієнт CORBA - клієнт RMI/IIOP - сервер CORBA - сервер Java RMI & CORBA
Використання технологій Java IDL та Java RMI/IIOP. Сумісні “RMI/IIOP-CORBA” клієнт-серверні проекти (1/2) Розглянемо один з варіантів сумісних “RMI/IIOP-CORBA” клієнт-серверних систем, а саме розподілену систему, яка складається з RMI/IIOP-сервера та CORBA-клієнта. Потреба у таких системах може виникати, наприклад, у таких випадках: припустимо є розроблений із використанням технології Java RMI/IIOP сервер, тобто є готовий RMI/IIOP-сервер, і треба реалізувати клієнтську програму, наприклад, у C++ (Object Pascal тощо) до того ж, можливо, на іншій платформі (у порівнянні з платформою сервера). Отже, виходячи із сумісності “RMI/IIOP-CORBA” проектів, можна клієнтську програму розробляти, ґрунтуючись на технології CORBA. Java RMI & CORBA
Використання технологій Java IDL та Java RMI/IIOP. Сумісні “RMI/IIOP-CORBA” клієнт-серверні проекти (2/2) Окремі кроки реалізації сумісного CORBA-клієнта можна представити наступним чином (для спрощення вважатимемо, що розподілена система ґрунтується на використання лише одного віддаленого класу): 1) за “віддаленим” класом треба отримати IDL-файл, скориставшись компілятором (rmic -idl ...); 2) до отриманого IDL-файлу належить застосувати idl -компілятор (idl2cpp , idl2pas тощо на клієнтській платформі), щоб згенерувати класи CORBA-proxy (як класи C++, Object Pascal тощо), зокрема, у даному випадку важливо отримати клас CORBA-stub; 3) на основі згенерованого stub-класу завершити розробку клієнтської CORBA-програми, використовуючи традиційні підхід, притаманний CORBA-технології. Java RMI & CORBA
Приклад 1 Сумісні “RMI/IIOP-CORBA” проекти. Розробка CORBA-проектів за Java RMI/IIOP-проектами. Java RMI & CORBA
Розробка CORBA - проектів за Java RMI/IIOP - проектами: Отримання IDL-файлів; Розробка CORBA-проектів (клієнтських). Переконаємось у RMI/IIOP-CORBA сумісності: RMI/IIOP-клієнт CORBA-клієнт RMI/IIOP-сервер Java RMI & CORBA
Java RMI/IIOP - проект import java.rmi.Remote; public interface sm extends Remote { float add(float arg1, float arg2) throws java.rmi.RemoteException; } import javax.rmi.PortableRemoteObject; public class smImpl extends PortableRemoteObject implements sm{ public smImpl() throws java.rmi.RemoteException { super(); // invoke rmi linking and remote object initialization } public float add(float arg1, float arg2) throws java.rmi.RemoteException { return (arg1 + arg2); } } smImpl.java sm.java import javax.naming.InitialContext; import javax.naming.Context; public class ServRMI_IIOP { public static void main(String[] args) { try { smImpl srvnt = new smImpl(); Context initctx = new InitialContext(); initctx.rebind("smService_IIOP", srvnt ); System.out.println("ServRMI_IIOP: Ready..."); } catch (Exception e) { System.out.println("Trouble: " + e); e.printStackTrace(); } } } ServRMI_IIOP.java Серверна частина Java RMI & CORBA
Розробка CORBA-проекту (клієнтської частини) rmic -idl smImpl idlj -fclient sm.idl Створення клієнтського основного класу smClientIDL.java Java RMI & CORBA
Крок: отримання IDL-файлів Sm1.java rmic -idl smImpl /** * sm.idl * Generated by rmic -idl. Do not edit * 3 Июнь 2007 г. 13:45:26 EEST */ #include "orb.idl" #ifndef __sm__ #define __sm__ interface sm { float add( in float arg0, in float arg1 ); }; #pragma ID sm "RMI:sm:0000000000000000" #endif sm.idl У підкаталозі з'являється файл sm.idl Можна було б спростити Java RMI & CORBA
CORBA-клієнт import org.omg.CosNaming.*; import org.omg.CosNaming.NamingContextPackage.*; import org.omg.CORBA.*; public class smClientIDL { static sm sm_Impl; public static void main(String args[]) { try{ ORB orb = ORB.init(args, null); org.omg.CORBA.Object objRef = orb.resolve_initial_references("NameService"); NamingContextExt ncRef = NamingContextExtHelper.narrow(objRef); String name = "smService_IIOP"; sm_Impl = smHelper.narrow(ncRef.resolve_str(name)); System.out.println("Obtained a handle on server object: " + sm_Impl); System.out.println(sm_Impl.add(10,5)); } catch (Exception e) { System.out.println("ERROR : " + e) ; e.printStackTrace(System.out); } } } smClientIDL.java (основний клієнтський клас) ... smImpl srvnt = new smImpl(); Context initctx = new InitialContext(); initctx.rebind("smService_IIOP", srvnt ); ServRMI_IIOP.java Java RMI & CORBA
Java RMI/IIOP -сервер та CORBA-клієнт java smClientIDL -ORBInitialPort 1050 -ORBInitialHost localhost java -Djava.naming.factory.initial= com.sun.jndi.cosnaming.CNCtxFactory -Djava.naming.provider.url=iiop://localhost:1050 ServRMI_IIOP Java RMI & CORBA
Приклад 2 Сумісні “RMI/IIOP-CORBA” проекти. Розробка Java RMI/IIOP- проектів за CORBA- проектами. Java RMI & CORBA
Розробка Java RMI/IIOP - проектів за CORBA - проектами Переконаємось у RMI/IIOP-CORBA сумісності: RMI/IIOP - клієнт CORBA - клієнт CORBA - сервер Java RMI & CORBA
CORBA - проект interface sm { float add( in float arg0, in float arg1 ); }; sm.idl idlj -fall sm.idl Java RMI & CORBA
CORBA-сервер. Файл smServerIDL.java (поч.) import org.omg.CosNaming.*; import org.omg.CosNaming.NamingContextPackage.*; import org.omg.CORBA.*; import org.omg.PortableServer.*; import org.omg.PortableServer.POA; class smImpl extends smPOA { public float add(float arg1, float arg2) { return arg1+arg2; } } smServerIDL.java (поч.) Клас smImpl – клас-сервант public interface sm extends smOperations, org.omg.CORBA.Object, org.omg.CORBA.portable.IDLEntity { } // interface sm public interface smOperations { float add (float arg0, float arg1); } // interface smOperations Java RMI & CORBA
CORBA-сервер. Файл smServerIDL.java (заверш.) public class smServerIDL { public static void main(String args[]) { try{ ORB orb = ORB.init(args, null); POA rootpoa = POAHelper.narrow(orb.resolve_initial_references("RootPOA")); rootpoa.the_POAManager().activate(); smImpl s = new smImpl(); org.omg.CORBA.Object ref = rootpoa.servant_to_reference(s); sm href = smHelper.narrow(ref); org.omg.CORBA.Object objRef = orb.resolve_initial_references("NameService"); NamingContextExt ncRef = NamingContextExtHelper.narrow(objRef); String name = "SmService_CORBA"; NameComponent path[] = ncRef.to_name( name ); ncRef.rebind(path, href); System.out.println("SmServerIDL ready and waiting ..."); orb.run(); // wait for invocations from clients } catch (Exception e) { System.err.println("ERROR: " + e); e.printStackTrace(System.out); } } } smServerIDL.java Java RMI & CORBA
Java RMI/IIOP -клієнт import java.rmi.RemoteException; import javax.rmi.*; import javax.naming.NamingException; import javax.naming.InitialContext; import javax.naming.Context; public class ClientRMI_IIOPtoCORBA { public static void main( String args[] ) { try { Context ic = new InitialContext(); Object objref = ic.lookup("SmService_CORBA"); System.out.println("Client: Obtained a ref to from name SmService_CORBA "); sm s = (sm) PortableRemoteObject.narrow(objref, sm.class); System.out.println("Obtained a handle on server object: " + s); System.out.println (s.add(2,5)); } catch( Exception e ) { System.err.println( "Exception " + e); e.printStackTrace( ); return; } } } ClientRMI_IIOPtoCORBA.java Java RMI & CORBA
Приклад 3 Розробка CORBA-клієнта за IDL-файлом для CORBA-сервера, розробленого під VisiBroker у Borland C++ Builder. Використання StringifiedIOR. Проблеми портабельності. Java RMI & CORBA
CORBA-сервер, розроблений під VisiBroker у Borland C++ Builder interface sm { float add(in float a1,in float a2); }; addit.idl Java RMI & CORBA
CORBA-клієнт (java) import org.omg.CORBA.*; import java.io.*; public class client2 { public static void main(String[] argv) { try{ String s = null; String s1 = null; BufferedReader in = new BufferedReader(new FileReader("MyORef.ior")); s=in.readLine(); s1=s.substring(0,s.length()-1); System.out.println(s1); ORB myORB = ORB.init(argv, null); org.omg.CORBA.Object objRef = myORB.string_to_object(s1); sm server = smHelper.narrow(objRef); System.out.println("ob to_string - " + server.toString()); System.out.println("adding 45+54 "+server.add(45,54)); BufferedReader stdin = new BufferedReader( new InputStreamReader(System.in)); System.out.print("Type Enter key"); System.out.println(stdin.readLine()); } catch (Exception e) { System.out.println("Error occurred while initializing server object:"); e.printStackTrace(); } } } idlj -fclient addit.idl client2.java Java RMI & CORBA
Портабельність Corba-рішень. Проблеми . . . String s = null; String s1 = null; BufferedReader in = new BufferedReader(new FileReader("MyORef.ior")); s=in.readLine(); s1=s.substring(0,s.length()-1); System.out.println(s1); ORB myORB = ORB.init(argv, null); org.omg.CORBA.Object objRef = myORB.string_to_object(s1); sm server = smHelper.narrow(objRef); . . . Фрагмент client2.java Відрізається останній символ (символ нового рядка) ! Java RMI & CORBA
sm1Impl sm = new sm1Impl(); org.omg.CORBA.Object ref = rootpoa.servant_to_reference(sm); sm1 href = sm1Helper.narrow(ref); . . . System.out.println("Server_Corba ready and waiting ..."); System.out.println("ob.toString - " + sm.toString()); System.out.println("obref.toString - " + href.toString()); System.out.println("StringifiedIOR - " + orb.object_to_string(href)); Server_Corba.java (фрагменти) toString: об'єкт об'єктне посилання StringifiedIOR CORBA-сервер (варіант 2) Java RMI & CORBA
RMI/IIOP-сервер import javax.naming.InitialContext; import javax.naming.Context; public class Sm1Server { public Sm1Server() { try { Sm1 sm = new Sm1Impl(); Context initialNamingContext = new InitialContext(); initialNamingContext.rebind("SmService", sm ); System.out.println("RMI/IIOP:Sm1Server ready ..."); System.out.print("ob.toString - " + sm.toString()); } catch (Exception e) { System.out.println("Fail: " + e); } } public static void main(String args[]) { new Sm1Server(); } } Sm1Server.java Java RMI & CORBA
Схожі презентації
Категорії