CORBA. Object Request Broker

Podobne dokumenty
Wprowadzenie CORBA ORB

Interfejs IUnknown. Każdy obiekt COM musi implementować interfejs IUnknown, który zawiera trzy metody:

Programowanie współbieżne i rozproszone

Plan wykładu CORBA. Cechy aplikacji rozproszonych. Aplikacje rozproszone

Zaawansowane aplikacje internetowe - laboratorium Architektura CORBA.

Wywoływanie metod zdalnych

Wywoływanie metod zdalnych

Zaawansowane aplikacje internetowe - laboratorium Architektura CORBA.

Podejście obiektowe do budowy systemów rozproszonych

Remote Method Invocation 17 listopada Dariusz Wawrzyniak (IIPP) 1

Remote Method Invocation 17 listopada 2010

Obiektowe programowanie rozproszone Java RMI. Krzysztof Banaś Systemy rozproszone 1

Podejście obiektowe do budowy systemów rozproszonych

Java RMI. Dariusz Wawrzyniak 1. Podejście obiektowe do budowy systemów rozproszonych. obiekt. interfejs. kliencka. sieć

Java RMI. Dariusz Wawrzyniak 1. Podejście obiektowe do budowy systemów rozproszonych. obiekt. interfejs. kliencka. sieć

Zdalne wywołanie metod - koncepcja. Oprogramowanie systemów równoległych i rozproszonych Wykład 7. Rodzaje obiektów. Odniesienie do obiektu

Remote Method Invocation 17 listopada rozproszonych. Dariusz Wawrzyniak (IIPP) 1

Oprogramowanie systemów równoległych i rozproszonych Wykład 7

Aplikacje RMI

Technologie COM i ActiveX COM - Component Object Model

Interfejsy w Javie. Przykład zastosowania interfejsów:

Aplikacje RMI Lab4

Microsoft Interface Definition Language

JAVA W SUPER EXPRESOWEJ PIGUŁCE

Aplikacje RMI. Budowa aplikacji rozproszonych. Część 2.

Kurs programowania. Wykład 1. Wojciech Macyna. 3 marca 2016

Systemy Rozproszone - Ćwiczenie 6

sieć 4) Mechanizm RMI jest zazwyczaj wykorzystywany w rozwiązaniach typu klient-serwer.

Systemy rozproszone. Dr inż. L. Miękina. Department of Robotics and Mechatronics AGH University of Science and Technology 1/1

Remote Method Invocation

Rozproszone systemy internetowe. Wprowadzenie. Koncepcja zdalnego wywołania procedury

Programowanie obiektowe

Kurs programowania. Wykład 2. Wojciech Macyna. 17 marca 2016

1 Atrybuty i metody klasowe

Obiekty w plikach wykonywalnych, marshaling

Java - wprowadzenie. Programowanie Obiektowe Mateusz Cicheński

RMI z IIOP POA (do współpracy z omniorb) Tomasz Kubik

Protokoly w technologii obiektow rozproszonych - CORBA, RMI/IIOP, COM, SOAP. Paweł Kozioł p.koziol@students.mimuw.edu.pl

Interfejsy. Programowanie obiektowe. Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki Politechniki Wrocławskiej

Programowanie w języku Java - Wyjątki, obsługa wyjątków, generowanie wyjątków

Wykład 7: Pakiety i Interfejsy

Kurs programowania. Wykład 9. Wojciech Macyna. 28 kwiecień 2016

Katedra Architektury Systemów Komputerowych Wydział Elektroniki, Telekomunikacji i Informatyki Politechniki Gdańskiej

Tworzenie i wykorzystanie usług

Programowanie obiektowe

Programowanie obiektowe

Zdarzenia (events, connection points)

Obszar statyczny dane dostępne w dowolnym momencie podczas pracy programu (wprowadzone słowem kluczowym static),

Komunikacja i wymiana danych

Kurs programowania. Wykład 3. Wojciech Macyna. 22 marca 2019

Dokumentacja do API Javy.

RMI-2. Java Remote Method Invocation (RMI) na podstawie m.in. podręcznika firmy Sun Microsystems SYSTEMY ROZPROSZONE

//////////////////////////////////////////////////////////// // Kalkulator (prosty) - wersja agregowalna import "unknwn.idl";

Java. język programowania obiektowego. Programowanie w językach wysokiego poziomu. mgr inż. Anna Wawszczak

Programowanie obiektowe

Plan prezentacji. Budowa aplikacji w technologii Enterprise JavaBeans. Przegląd architektur: CORBA. Cele budowy aplikacji rozproszonych

76.Struktura oprogramowania rozproszonego.

Programowanie rozproszone w języku Java

Wyjątki (exceptions)

Programowanie obiektowe

Zaawansowane aplikacje WWW - laboratorium

Programowanie Komponentowe WebAPI

JAVA. Java jest wszechstronnym językiem programowania, zorientowanym. apletów oraz samodzielnych aplikacji.

Henryk Budzisz. materiały przygotowane w ramach projektu ZPORR nr POKL /08-00

Common Object Request Broker Architecture (CORBA)

Wykład 2 Wybrane konstrukcje obiektowych języków programowania (1)

Programowanie obiektowe

Podczas dziedziczenia obiekt klasy pochodnej może być wskazywany przez wskaźnik typu klasy bazowej.

Budowa aplikacji w technologii. Enterprise JavaBeans. Maciej Zakrzewicz PLOUG

1 Wprowadzenie do J2EE

Programowanie w Internecie. Java

Programowanie składnikowe. Programowanie składnikowe w modelu COM. COM - Component Object Model. wprowadzenie. Programowanie składnikowe

Systemy Rozproszone Technologia ICE

Programowanie obiektowe. Literatura: Autor: dr inŝ. Zofia Kruczkiewicz

Wprowadzenie. Dariusz Wawrzyniak 1

Zdalne wywołanie procedur. Krzysztof Banaś Systemy rozproszone 1

Współbieżność w środowisku Java

Java jako język programowania

Java: kilka brakujących szczegółów i uniwersalna nadklasa Object

Aplikacje Internetowe. Najprostsza aplikacja. Komponenty Javy. Podstawy języka Java

Architektury Usług Internetowych. Laboratorium 2. Usługi sieciowe

Podstawy programowania obiektowego

Zaawansowane aplikacje internetowe CORBA. wykład prowadzi Mikołaj Morzy CORBA

Kurs programowania. Wykład 9. Wojciech Macyna

Java - tablice, konstruktory, dziedziczenie i hermetyzacja

Języki i metody programowania Java INF302W Wykład 2 (część 1)

Wykład 4: Klasy i Metody

Współbieżność i równoległość w środowiskach obiektowych. Krzysztof Banaś Obliczenia równoległe 1

Laboratorium 03: Podstawowe konstrukcje w języku Java [2h]

Aplikacje internetowe i rozproszone - laboratorium

Wątek - definicja. Wykorzystanie kilku rdzeni procesora jednocześnie Zrównoleglenie obliczeń Jednoczesna obsługa ekranu i procesu obliczeniowego

Zdalne wywołanie procedur. Krzysztof Banaś Systemy rozproszone 1

Java JMX. Marcin Werla. Monitorowanie i zarządzanie usługami sieciowymi w Javie. mwerla@man.poznan.pl PCSS/Poznań JUG

Dziedziczenie. Tomasz Borzyszkowski

Język JAVA podstawy. wykład 2, część 1. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna

Sposoby tworzenia projektu zawierającego aplet w środowisku NetBeans. Metody zabezpieczenia komputera użytkownika przed działaniem apletu.

Komponenty sterowane komunikatami

Klasy abstrakcyjne, interfejsy i polimorfizm

Instrukcja laboratoryjna cz.3

Zdalne wywołania procedur. Jarosław Kuchta Programowanie Współbieżne

Transkrypt:

CORBA i COM 1. CORBA (Common Object Request Broker Architecture) wprowadzenie, model operacji, język IDL. przykład aplikacji rozproszonej CORBA. 2. Technologia COM (DCOM) wprowadzenie, korzystanie z obiektu COM, program klienta, schemat programu serwera. 3. Porównanie DCOM, CORBA i RMI. 1

CORBA CORBA (Common Object Request Broker Architecture) specyfkacja określająca funkcjonalność ORB. Opiekę nad standardem sprawuje OMG (Object Managment Group). ORB (Object Request Broker) magistrala dla komunikatów zawierających żądania wywołań oraz ich wyniki, wymienianych pomiędzy obiektami CORBA i klientami. Specyfkacja dostarcza interfejsów dla komponentów ORB nie określając ich implementacji. CORBA - podstawowe cechy: jednolity dostęp do obiektów niezależnie od ich fzycznej lokalizacji, niezależność od języka programowania IDL (Interface Defnition Language), 2

CORBA program klienta Stub Object Request Broker Skeleton implementacja obiektu Klient za pośrednictwem ORB kontaktuje się z implementacją obiektu. Przekaz danych jest realizowany za pośrednictwem procedur łącznikowych Stub i Skeleton. 3

Model operacji Istnieją dwa podstawowe rodzaje wywołań operacji: At-Most-Once. Operacja jest wywoływana dokładnie raz. Program klienta zostaje wstrzymany do momentu zakończenia operacji i zwrócenia wyników lub zgłoszenia wyjątku. Best-Efort. Program klienta nie czeka na zakończenie wywołanej operacji. Istnieje też możliwość wywołania operacji w taki sposób, aby program klienta nie był blokowany, natomiast wyniki działania operacji zostaną odebrane później (Deferred-Synchronous). 4

Model operacji Sygnatura operacji zapisana w języku IDL zawiera: identyfkator operacji (nazwę), typ zwracanej wartości, listę parametrów wywołania każdy parametr jest określony przez typ i tzw. kierunek (direction): in, out, inout określający sposób przekazywania parametru, np. in przekazanie parametru przez klienta do obiektu. Sygnatura może ponadto zawierać: listę zwracanych wyjątków (raises), rodzaj wywołania (best-efort), zmienne środowiskowe, które muszą być przesłane wraz z żądaniem wykonania operacji. 5

Wyjątki Wyjątki (exceptions) stanowią specjalizowany nieobiektowy typ w języku IDL. Wyjątek posiada nazwę i opcjonalne atrybuty udostępniające dalsze, szczegółowe informacje. CORBA zawiera deklaracje 31 wyjątków odnoszących się do problemów z siecią, ORB lub systemem operacyjnym. Każdy z tych wyjątków zawiera dwa zbiory danych określających: status wykonania operacji: COMPLETED_YES, COMPLETED_NO, COMPLETED_MAYBE, określający czy wywołana operacja została wykonana, liczę całkowitą określającą kod błędu liczba ta może być zależna od implementacji ORB. Dodatkowe wyjątki mogą być defniowane przez programistę 6

Język IDL Interface Defnition Language służy do defniowania interfejsów dla obiektów działających na platformie CORBA. Przykłady: module Hotel{ interface Room{; ; module Inheritance{ interface A{ typedef unsigned short ushort; ushort operacja1(); interface B:A{ boolean operacja2(ushort n); ; ; Interfejs B udostępnia dwie operacje: operacja1() i operacja2(). Interfejs może dziedziczyć po kilku interfejsach z różnych modułów. 7

Program w technologii CORBA Aplikację kliencką korzystającą z technologii CORBA buduje się w następujących krokach: 1. Napisanie i kompilacja interfejsów w języku IDL. 2. Identyfkacja wygenerowanych interfejsów i klas do późniejszego wykorzystania lub implementacji. 3. Napisanie kodu klienta obiektów CORBA. 4. Implementacja interfejsu IDL w docelowym języku programowania 5. Napisanie programu serwera 6. Uruchomienie programu. 8

Krok 1: interfejs w IDL'u Plik Hello.idl module HelloApp{ interface Hello{ string sayhello(); ; ; oneway void shutdown(); // definicje operacji Kompilacji dokonuje się za pomocą kompilatora IDL dostosowanego do używanego języka programowania. Obecnie istnieją kompilatory dla następujących języków: Ada, C, C++, COBOL, Java, Lisp, PL/1, Python, Smalltalk. 9

Krok 2: identyfkacja wygenerowanych plików Standardowo dostępny kompilator dla języka Java uruchamia się poleceniem: idlj -fall Hello.idl Można też używać innych kompilatorów. Najpopularniejsze z nich to idltojava oraz idl2java. W wyniku kompilacji zostanie utworzony katalog HelloApp, w którym pojawią się pliki: HelloOperations.java zawiera defnicję interfejsu w Javie opisującego dostępne operacje. Hello.java interfejs w Javie reprezentujący interfejs IDL. Rozszerza HelloOperations.java o metody charakterystyczne dla technologii CORBA. 10

Krok 2: identyfkacja wygenerowanych plików HelloHolder.java dostarcza operacji dla parametrów out i inout. HelloHelper.java jest odpowiedzialny za odczytywanie i zapisywanie strumieniów CORBA, obsługi typów Any. Wykorzystywany przez Holder do odczytu i zapisu informacji. Zawiera też metodę do rzutowania obiektów CORBA. HelloStub.java klasa łącznikowa klienta (stub) implementująca HelloApp.Hello HelloPOA.java klasa łącznikowa serwera (skeleton). 11

Krok 3: kod klienta Plik HelloClient.java import HelloApp.*; import org.omg.cosnaming.*; import org.omg.cosnaming.namingcontextpackage.*; import org.omg.corba.*; public class HelloClient{ static Hello helloimpl; public static void main(string args[]){ try{ ORB orb = ORB.init(args, null); // utworzenie i inicjalizacja ORB org.omg.corba.object objref = orb.resolve_initial_references ("NameService"); // pobranie kontekstu nazw NamingContextExt ncref = NamingContextExtHelper.narrow(objRef); String name = "Hello"; // wyszukanie obiektu w kontekscie helloimpl = HelloHelper.narrow(ncRef.resolve_str(name)); System.out.println("otrzymano uchwyt: " + helloimpl); System.out.println(helloImpl.sayHello()); helloimpl.shutdown(); catch (Exception e) { System.out.println("ERROR : " + e) ; 12

Krok 4: implementacja interfejsu Plik HelloImpl.java zawiera implementację interfejsu HelloApp.Hello import HelloApp.*; import org.omg.corba.*; public class HelloImpl extends HelloPOA { private ORB orb; public void setorb(orb orb_val) { orb = orb_val; public String sayhello() { return "\nhello world!!\n"; public void shutdown() { orb.shutdown(false); 13

Krok 5: kod serwera Plik HelloServer.java zawiera kod serwera import HelloApp.*; import org.omg.cosnaming.*; import org.omg.cosnaming.namingcontextpackage.*; import org.omg.corba.*; import org.omg.portableserver.*; public class HelloServer { public static void main(string args[]){ try{ ORB orb = ORB.init(args, null); // utworzenie i inicjalizacja ORB POA rootpoa = POAHelper.narrow(orb.resolve_initial_references "RootPOA")); // referencja do POA (Skeletonu) rootpoa.the_poamanager().activate(); 14

Krok 5: kod serwera HelloImpl helloimpl = new HelloImpl();// stworzenie obiektu usługowego helloimpl.setorb(orb); // i rejestracja w ORB org.omg.corba.object ref = rootpoa.servant_to_reference(helloimpl); Hello href = HelloHelper.narrow(ref); // odebranie referencji do obiektu org.omg.corba.object objref = orb.resolve_initial_references ("NameService"); // uzyskanie kontekstu nazw NamingContextExt ncref = NamingContextExtHelper.narrow(objRef); String name = "Hello"; // związanie obiektu z nazwą NameComponent path[] = ncref.to_name(name); ncref.rebind(path, href); System.out.println("HelloServer gotowy..."); orb.run(); // czeka na zgłoszenia klientów catch (Exception e) { System.err.println("ERROR: " + e); System.out.println("HelloServer Exiting..."); 15

Krok 6: kompilacja i uruchomienie Kompilujemy pliki: javac HelloServer.java HelloApp/*.java javac HelloClient.java HelloApp/*.java Uruchomienie aplikacji rozproszonej: 1. uruchomienie orbd: orbd -ORBInitialPort 1050 -ORBInitialHost localhost & 2. uruchomienie serwera java HelloServer -ORBInitialPort 1050 -ORBInitialHost localhost & 3. uruchomienie programu klienta: java HelloClient -ORBInitialPort 1050 -ORBInitialHost localhost 16

Serwer typu persistant Przykładowy serwer udostępnia obiekty typu transient, tzn. czas życia takich obiektów jest ściśle związany z czasem życia procesu serwera, który je stworzył. W momencie zakończenia pracy serwera wszystkie referencje utrzymywane przez klientów do takiego obiektu stają się nieaktualne. Odmienne zachowanie jest cechą obiektów typu persistant. Referencje nich są niezależne od czasu życia procesu serwera. Jeżeli nadejdzie zgłoszenie do takiego obiektu, ORB automatycznie uruchomi odpowiedni serwer. Obiekty persistant żyją dopóki nie zostaną w sposób jawny usunięte (zniszczone). Począwszy od wersji J2SE 1.4 można operować na takich obiektach. 17 17

Podsumowanie CORBA jest platformą służącą do tworzenia programów rozproszonych. W porównaniu do wcześniej omówionych rozwiązań (RPC, RMI) CORBA nie jest związana z żadnym konkretnym językiem programowania. Jej działanie opiera się na udostępnianiu rozproszonych obiektów, których własności defniuje się za pomocą specjalnego języka - IDL. Implementacje tych obiektów mogą być tworzone w jednym z wielu popularnych języków programowania. 18

COM (DCOM) Opracowana przez Microsoft technologia COM (Component Object Model) pozwala uniezależnić tworzenie aplikacji od języka programowania oraz platformy systemowej. U podstaw tej technologii leży pojęcie interfejsu, który w formie binarnej jest tablicą wskaźników do funkcji. Najczęściej obiekty COM spotyka się pod postacią kontrolek ActiveX (OCX OLE Control extension), jednak istnieje możliwość stosowania ich także w środowisku rozproszonym DCOM (Distributed COM). Implementacja interfejsu obiektu COM znajduje się w tzw. co-klasie (Component Object Class). 19

Interfejs IUnknown Każdy obiekt COM musi implementować interfejs IUnknown, który zawiera trzy metody: AddRef() - zwiększa licznik odwołań do obiektu, Interface() - zwraca wskaźnik do żądanego interfejsu, Release() - zwalnia obiekt. Obiekt COM może obsługiwać wielu klientów jednocześnie, jednak kolejne żądania nie powodują ponownego utworzenia obiektu, a jedynie zwiększają jego licznik odwołań. Gdy ostatni z klientów zwalnia obiekt, biblioteka COM samoczynnie wyładowuje go z pamięci 20

Identyfkacja obiektów COM W celu jednoznacznej identyfkacji obiektów COM używa się 128- bitowych identyfkatorów: GUID (Globally Unique Identifer) lub UUID (Universally Unique Identifer), CLSID używany dla co-klas, IID używany dla interfejsów. Wszystkie identyfkatory są generowane automatycznie przez środowiska programistyczne (np. Visual Studio 6.0 lub Visual Studio.NET) 21

Co-Klasy, pojemniki i kontenery Kod obiektu COM znajduje się w tzw. co-klasie. Co-klasa implementuje dany interfejs, a w trakcie wywołania, jej instancja staje się obiektem COM. Obiekt COM w rzeczywistym świecie musi być opakowany w kod wykonywalny. W Windows sprowadza się to do trzech możliwych pojemników, które mogą przenosić obiekty COM. Są nimi plik DLL, program typu EXE oraz serwis (na platformach zgodnych z NT). Kontenerem dla obiektu COM jest program, w którym jest on używany np. Program zawierający kontrolki OCX, przeglądarki internetowe używające ActiveX. 22

Korzystanie z obiektu COM Nowy obiekt powołujemy do życia za pomocą instrukcji CoCreateInterface(). Argumenty: identyfkator klasy, wskaźnik określający rodzaj obiektu, rodzaj serwera dla obiektu COM, identyfkator interfejsu, miejsce w które zostanie wpisany wskaźnik do interfejsu. Wartość zwracana: wartość typu HRESULT, którą można testować za pomocą makr SUCCEEDED i FAILED. 23

Klient COM #include "Klient\stdafx.h" #include "..\Serwer\Serwer.h" #include <iostream> using namespace std; #define EVER ;; int main(int argc, char* argv[]){ HRESULT hr; // wskaźnik powodzenia operacji _bstr_t messag; // typ do manipulacji UNICODE w COM IComSerwer* pics; // wskaźnik do interfejsów if ( FAILED( CoInitialize(NULL) )){ // Inicjalizacja biblioteki COM printf("problem z inicjalizacją OLE"); return 1; hr = CoCreateInstance ( uuidof(comserwer), NULL, CLSCTX_INPROC_SERVER, uuidof(icomserwer), (void**) &pics ); // tworzenie instancji interfejsu 24

Klient COM if ( FAILED( hr) ){ // obsługa błędów printf("serwer COM niedostępny"); return 1; cout << "Podaj tekst dla serwera COM:" << endl; char buff[256]; cin >> buff; // przepisanie tekst z wejścia do bufora messag = buff; // przekształcenie do BSTR pics->hello(messag); pics->release(); return 0; // wywołanie obiektu COM // zwolnienie interfejsu 25

Interfejs IDL Obecne narzędzia programistyczne udostępniają grafczne narzędzia wspierające proces tworzenia oprogramowania serwera COM. Na wstępie należy wybrać rodzaj pojemnika dla obiektu COM (DLL, plik EXE, serwis NT). Kolejną czynnością jest zaprojektowanie interfejsu IDL. Dodawanie nowych klas powoduje automatyczne generowanie plików źródłowych w których należy umieścić implementację metod zdalnego obiektu. 26

Implementacja Hello ComSerwer.cpp #include "Serwer\stdafx.h" #include "Serwer.h" #include "ComSerwer.h" STDMETHODIMP CComSerwer::Hello(BSTR bstrmsg) { HRESULT hrret = S_OK; _bstr_t bsmsg = "Oto odpowiedź z serwera COM:\n"; bsmsg += bstrmsg; LPCTSTR szmsg = (TCHAR*) bsmsg; MessageBox ( NULL, szmsg, _T("Serwer COM"), MB_OK ); return hrret; 27

Porównanie RMI, CORBA i DCOM Technologia DCOM ma zastosowanie w tych samych sytuacjach, w których można użyć zdalnych obiektów CORBA lub RMI. Do porównania technologii wykorzystamy przykładową aplikację rozproszoną napisaną w Javie. Lit. http://my.execpc.com/~gopalan/misc/compare.html 28

Interfejs IDL DCOM: StockMarketLib.idl [ uuid(7371a240-2e51-11d0-b4c1-444553540000),version(1.0) ] library SimpleStocks{ importlib("stdole32.tlb"); [ uuid(bc4c0ab0-5a45-11d2-99c5-00a02414c655), dual ] interface IStockMarket : IDispatch{ HRESULT get_price([in] BSTR p1, [ out, retval ] float *rtn); ; [ uuid(bc4c0ab3-5a45-11d2-99c5-00a02414c655),] coclass StockMarket{ interface IStockMarket; ; ; CORBA: StockMarket.idl module SimpleStocks{ interface StockMarket{ float get_price( in string symbol ); ; ; RMI: StockMarket.java package SimpleStocks; import java.rmi.*; import java.util.*; public interface StockMarket extends java.rmi.remote{ float get_price( String symbol ) throws RemoteException; 29

Program klienta DCOM import simplestocks.*; public class StockMarketClient{ public static void main(string[] args){ try{ IStockMarket market = (IStockMarket)new simplestocks.stockmarket(); System.out.println( "Cena: " + market.get_price("nasdaq") ); catch (com.ms.com.comfailexception e){ System.out.println( "COM Exception:" ); System.out.println( e.gethresult() ); System.out.println( e.getmessage() ); RMI import java.rmi.*; import java.rmi.registry.*; import SimpleStocks.*; public class StockMarketClient{ public static void main(string[] args)throws Exception{ if(system.getsecuritymanager() == null){ System.setSecurityManager(new RMISecurityManager()); StockMarket market = (StockMarket)Naming.lookup ("rmi://localhost/wig"); System.out.println( "Cena: " + market.get_price("firma") ); CORBA import org.omg.corba.*; import org.omg.cosnaming.*; import SimpleStocks.*; public class StockMarketClient{ public static void main(string[] args){ try{ ORB orb = ORB.init(); NamingContext root = NamingContextHelper.narrow (orb.resolve_initial_references ("NameService") ); NameComponent[] name = new NameComponent[1] ; name[0] = new NameComponent("WIG",""); StockMarket market = StockMarketHelper.narrow (root.resolve(name)); System.out.println("Cena: " + market.get_price ("FIRMA")); catch( SystemException e ){ System.err.println( e ); 30

Implementacja obiektu DCOM RMI import com.ms.com.*; import simplestocks.*; public class StockMarket implements IStockMarket{ private static final String CLSID = "BC4C0AB3-5A45-11d2-99C5- public class StockMarketImpl extends UnicastRemoteObject 00A02414C655"; implements StockMarket{ public float get_price( String symbol ){ public float get_price( String symbol ){ float price = 0; float price = 0; for( int i = 0; i < symbol.length(); i++ ){ for( int i = 0; i < symbol.length(); i++ ){ price += (int) symbol.charat(i); price += (int) symbol.charat( i ); price /= 5; price /= 5; return price; return price; CORBA import org.omg.corba.*; import SimpleStocks.*; public class StockMarketImpl extends _StockMarketImplBase{ public float get_price( String symbol ){ float price = 0; for(int i = 0; i < symbol.length(); i++){ price += (int) symbol.charat( i ); price /= 5; return price; package SimpleStocks; import java.rmi.*; import java.rmi.server.unicastremoteobject; public StockMarketImpl( String name ) throws RemoteException{ try{ Naming.rebind( name, this ); catch( Exception e ){ System.out.println( e ); public StockMarketImpl( String name ){ super( name ); 31

Proces serwera DCOM REGEDIT4 [HKEY_CLASSES_ROOT\CLSID\{BC4C0AB3-5A45-11d2-99C5-00A02414C655] @="Java Class: StockMarket" "AppID"="{BC4C0AB3-5A45-11d2-99C5-00A02414C655" [HKEY_CLASSES_ROOT\CLSID\{BC4C0AB3-5A45-11d2-99C5-00A02414C655\InprocServer32] @="MSJAVA.DLL" "ThreadingModel"="Both" "JavaClass"="StockMarket" [HKEY_CLASSES_ROOT\CLSID\{BC4C0AB3-5A45-11d2-99C5-00A02414C655\LocalServer32] @="javareg /clsid:{bc4c0ab3-5a45-11d2-99c5-00a02414c655 /surrogate" [HKEY_CLASSES_ROOT\CLSID\{BC4C0AB3-5A45-11d2-99C5-00A02414C655\Implemented Categories] [HKEY_CLASSES_ROOT\CLSID\{BC4C0AB3-5A45-11d2-99C5-00A02414C655\Implemented Categories\{BE0975F0-BBDD-11CF-97DF- 0AA001F73C1] [HKEY_CLASSES_ROOT\AppID\{BC4C0AB3-5A45-11d2-99C5-00A02414C655] @="Java Class: StockMarket" RMI import java.rmi.*; import java.rmi.server.unicastremoteobject; import SimpleStocks.*; public class StockMarketServer{ public static void main(string[] args) throws Exception{ if(system.getsecuritymanager() == null){ System.setSecurityManager(new RMISecurityManager()); StockMarketImpl stockmarketimpl = new StockMarketImpl("WIG"); 32

Proces serwera CORBA import org.omg.corba.*; import org.omg.cosnaming.*; import SimpleStocks.*; public class StockMarketServer{ public static void main(string[] args){ try{ ORB orb = ORB.init(); BOA boa = orb.boa_init(); StockMarketImpl stockmarketimpl = new StockMarketImpl("WIG"); boa.obj_is_ready( stockmarketimpl ); org.omg.corba.object object = orb.resolve_initial_references("nameservice"); NamingContext root = NamingContextHelper.narrow( object ) ; NameComponent[] name = new NameComponent[1]; name[0] = new NameComponent("WIG", ""); root.rebind(name, stockmarketimpl); boa.impl_is_ready(); catch( Exception e ){ e.printstacktrace(); 33

Wiele interfejsów: DCOM umożliwia implementację wielu interfejsów na poziomie obiektu. Do wyboru interfejsu służy metoda QueryInterface(). Oznacza to, że obiekt proxy po stronie klienta ładuje dynamicznie wiele procedur łącznikowych w warstwie zdalnej, zależnie od ilości używanych interfejsów. RMI, CORBA umożliwia wielokrotne dziedziczenie na poziomie interfejsu. Niezbędne interfejsy: Porównanie RMI, CORBA i DCOM DCOM każdy obiekt implementuje IUnknown. CORBA każdy interfejs rozszerza CORBA.Object. RMI każdy obiekt serwera implementuje java.rmi.remote. 34

Zdalne obiekty: DCOM udostępnia zdalny obiekt poprzez wskaźnik do interfejsu. CORBA udostępnia obiekt przez referencję, która ma jednoznaczną postać tekstową. RMI udostępnia obiekt przez referencję. Identyfkatory zdalnych obiektów: DCOM identyfkuje interfejs za pomocą IID natomiast klasę implementującą poprzez CLSID, mapowanie - rejestr systemu Windows. CORBA identyfkuje interfejs poprzez nazwę. Implementacja jest odnajdywana za pomocą odpowiedniego repozytorium nazw. RMI identyfkuje interfejs poprzez nazwę. Implementacja jest znajdowana za pomocą URL'a. Mapowaniem zajmuje się specjalna usługa (rmiregistry). Porównanie RMI, CORBA i DCOM 35

Porównanie RMI, CORBA i DCOM Używany protokół: DCOM ORPC (Object Remote Procedure Call). CORBA IIOP. RMI JRMP lub IIOP. Aktywacja zdalnego obiektu przez klienta: DCOM wywołanie odpowiedniej funkcji np. CoCreateInstance(). CORBA np. poprzez pobranie referencji. RMI poprzez pobranie referencji metodą Naming.lookup(). Obsługa błędów: DCOM poprzez zmienną typu HRESULT. CORBA, RMI wyjątki. 36

Program odpowiedzialny za wyszukanie i aktywację obiektu: DCOM Serwis Control Manager. CORBA wyszukiwanie: ORB, aktywacja: adapter obiektu (BOA lub POA). RMI JVM. Nazwy procedur lącznikowych po stronie klienta i serwera: DCOM proxy i stub. CORBA, RMI proxy lub stub i skeleton. Przekazywanie parametrów: DCOM przez wartość lub referencję w zależności od specyfkacji. CORBA typ interface przez referencje. Pozostałe przez wartość. RMI obiekty implementujące java.rmi.remote przez referencje. Pozostałe przez wartość. Porównanie RMI, CORBA i DCOM 37

Porównanie RMI, CORBA i DCOM Zarządzanie zdalnymi obiektami: DCOM próbuje automatycznie zwalniać pamięć po nieużywanych obiektach. CORBA nie zwalnia automatycznie pamięci. RMI automatycznie zwalnia pamięć po nieużywanych obiektach używając mechanizmów JVM. Wieloplatformowość: DCOM, CORBA, RMI dowolna na którą istnieje implementacja odpowiednio: serwera COM, ORB, JVM. Języki programowania dla zdalnych obiektów: DCOM, CORBA większość popularnych języków programowania. RMI Java. 38

Podsumowanie Architektura CORBA, DCOM i Java/RMI udostępnia mechanizm przezroczystego wywoływania i dostępu do zdalnych obiektów. Pomimo, że technologie różnią się w wielu elementach składających się na uzyskanie zakładanej funkcjonalności ogólna zasada działania jest we wszystkich przypadkach podobna. 39