Presentation is loading. Please wait.

Presentation is loading. Please wait.

Broker in practica: Middleware

Similar presentations


Presentation on theme: "Broker in practica: Middleware"— Presentation transcript:

1 Broker in practica: Middleware
Tool Generare Proxy-uri Biblioteca(API)+ Executabile Application Developer

2 Implementari de referinta ale arhitecturii Broker
Middleware care implementeaza tiparul Broker: CORBA: Common Object Request Broker Architecture. Arhitectura de referinta elaborata de OMG (Object Management Group) Diverse implementari, comerciale sau open RMI: Java Remote Method Invocation - Sun .NET Remoting - Microsoft

3 Arhitectura comuna Server Client implements Remote Interface Remote
Object uses implements ClientSide Proxy ServerSide Proxy Broker

4 Exemplu Aplicatie distribuita simpla: realizarea unui sistem StockMarket, care poate fi interogat de la distanta asupra valorii curente a actiunilor unor companii specificate Middleware (Broker) utilizat - 3 variante: CORBA RMI .NET Remoting Se compara: Suportul oferit de cele 3 implementari de Broker pentru dezvoltarea unei aplicatii distribuite simple Pasii necesari pentru realizarea aplicatiei Exemplul ajuta la intelegerea functionarii unui Broker in general

5 Pasi de dezvoltare ai aplicatiei
1. Definire interfata obiect la distanta INTERFACE StockMarket float get_price(Company) 2. Implementare obiect 4. Implementare Server 5. Implementare Client StockMarketServer StockMarketClient StockMarketImpl 6. Rulare aplicatie 3. Generare Proxy 3. Generare Proxy StockMarket ClientSide PROXY StockMarket ServerSide PROXY Broker

6 RMI: Arhitectura Server Client implements Remote Interface Remote
Object uses implements Stub (ClientSide Proxy) Skeleton (ServerSide Proxy) Remote Reference Layer Transport Layer

7 RMI - Pas1. Definire interfata
Se defineste interfata StockMarket Aceasta exporta operatia get_price: Parametru: numele companiei cotate la bursa Rezultat: valoarea actiunilor package SimpleStocks; import java.rmi.*; public interface StockMarket extends java.rmi.Remote { float get_price (String Company) throws RemoteException; } Specific RMI: Interfata trebuie sa extinda java.rmi.Remote Metodele trebuie sa poata genera exceptii RemoteException Fisier StockMarket.java

8 RMI - Pas 2. Implementare Obiect
Se implementeaza clasa StockMarketImpl Aceasta realizeaza operatia get_price import java.rmi.*; import java.rmi.server.UnicastRemoteObject; public class StockMarketImpl extends UnicastRemoteObject implements StockMarket { public StockMarketImpl() throws RemoteException {} public float get_price(String company) { float price=12345; return price; } Specific RMI: Implementarea trebuie sa extinda UnicastRemoteObject Fisier StockMarketImpl.java

9 RMI - Pas 3. Generare Proxy-uri
RMI Stub/Skeleton Se genereaza automat din implementarea obiectului server >rmic –v1.1 –keep StockMarketImpl Rezulta clase pentru stub si skeleton, utilizand conventia de nume: StockMarketImpl_Stub.class StockMarketImpl_Skel.class (incepand cu versiunea Java 1.2 implicit nu se mai genereaza skeleton-ul, de aceea e optiunea –v1.1) Observatie: incepand cu versiunea Java 1.5, nu mai este necesara pre-generarea stub-ului cu rmic, acesta poate fi generat dinamic la runtime prin mecanismul de dynamic proxy Se poate alege daca se doreste utilizarea unui stub pregenerat sau crearea unui stub cu dynamic proxy, chiar daca ar exista stub-ul pregenerat prin setarea corespunzatoare a valorii system property java.rmi.server.ignoreStubClasses

10 RMI - Pas 4. Implementare Server
Se implementeaza un program StockMarketServer, care creaza un obiect de tip StockMarket, ce poate fi accesat de la distanta Obiectul creat este inregistrat sub numele “NASDAQ” import java.rmi.*; import SimpleStocks.*; public class StockMarketServer { public static void main(String[] args) { try { StockMarketImpl stockMarketImpl = new StockMarketImpl(); Naming.rebind("NASDAQ", stockMarketImpl ); } catch (Exception e) {} } Specific RMI: Naming Fisier StockMarketServer.java

11 RMI - Pas 5. Implementare Client
Se implementeaza un program StockMarketClient, care acceseaza un obiect de tip StockMarket aflat la distanta, si invoca operatia get_price pentru un nume de companie Prin intermediul Broker se localizeaza obiectul cu numele “NASDAQ” import java.rmi.*; import SimpleStocks.*; public class StockMarketClient { public static void main(String[] args) { try { StockMarket market= (StockMarket) Naming.lookup("rmi://localhost/NASDAQ"); float price=market.get_price("ABC SRL"); System.out.println("Price is "+price); } catch (Exception e) { System.out.println("Exception !");} } Specific RMI: Naming.lookup Fisier StockMarketClient.java

12 RMI - Pas 6. Rulare aplicatie
RMI Registry = non-persistent Naming Service > start rmiregistry > start java StockMarketServer > start java StockMarketClient Codul aplicatiei exemplu poate fi download-ad de pe pagina cursului, de la sectiunea de exemple de cod pentru cursul c7: RMI_StockMarket

13 ORB (Object Request Broker)
CORBA: Arhitectura Server Client Remote Interface IDL Remote Object Dynamic Invocation Interface IDL Stub (ClientSide Proxy) IDL Skeleton (ServerSide Proxy) Object Adapter ORB Interface Implem Repository Interface Repository ORB (Object Request Broker)

14 CORBA - Pas1. Definire interfata
module SimpleStocks { interface StockMarket { float get_price(in string Company); }; Se defineste interfata StockMarket Aceasta exporta operatia get_price: Parametru: numele companiei cotate la bursa Rezultat: valoarea actiunilor Specific CORBA: Interfata se defineste intr-un limbaj neutru, CORBA IDL Fisier StockMarket.idl

15 CORBA - Pas 2. Generare Proxy-uri
CORBA IDL Stub/Skeleton Se genereaza automat din definitia interfetei IDL > idl2java StockMarket.idl Rezulta clasele/fisierele: Client Stub: _st_StockMarket.java Server Stub: _StockMarketImplBase.java

16 CORBA - Pas 3. Implementare Obiect
Se implementeaza clasa StockMarketImpl Aceasta realizeaza operatia get_price import org.omg.CORBA.*; import SimpleStocks.*; public class StockMarketImpl extends _StockMarketImplBase { public float get_price(in string company) { float price=12345; return price; } public StockMarketImpl (String name) { super(name); Specific CORBA: Un obiect accesibil la distanta trebuie sa extinda server-side-proxy-ul generat automat din descrierea interfetei Fisier StockMarketImpl.java

17 CORBA - Pas 4. Implementare Server
import org.omg.CORBA.*; 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(“NASDAQ”); boa.obj_is_ready(stockMarketImpl); boa. Impl_is_ready(); } catch (Exception e) {} } Se implementeaza un program StockMarketServer, care creaza un obiect de tip StockMarketImpl, ce poate fi accesat de la distanta Obiectul creat este inregistrat sub numele “NASDAQ” Specific CORBA: ORB BOA Fisier StockMarketServer.java

18 CORBA - Pas 5. Implementare Client
import org.omg.CORBA.*; import SimpleStocks.*; public class StockMarketClient { public static void main(String[] args) { try { ORB orb=ORB.init(); StockMarket market= StockMarketHelper.bind(orb, “NASDAQ”); market.get_price(“ABC SRL”); } catch (Exception e) {} } Se implementeaza un program StockMarketClient, care acceseaza un obiect de tip StockMarket aflat la distanta, si invoca operatia get_price pentru un nume de companie Prin intermediul Broker se localizeaza obiectul cu numele “NASDAQ” Specific CORBA: ORB StockMarketHelper = proxy generat Fisier StockMarketClient.java

19 CORBA - Pas 6. Rulare aplicatie
Location service (numele OSAgent e specific unei anumite implementari CORBA) > start osagent start java StockMarketServer start java StockMarketClient

20 .NET Remoting Architecture
Server Client Remote Interface Remote Object TransparentProxy RealProxy Remoting system Remoting system Channel

21 .NET – Pas 1. Definire Interfata Remote
public interface StockMarket { float get_price(string company); } Fisier StockMarket.cs Se defineste interfata StockMarket Aceasta exporta operatia get_price: Parametru: numele companiei cotate la bursa Rezultat: valoarea actiunilor Specific .NET: Interfata nu contine nimic special Nu este neaparat nevoie sa fie definita o interfata

22 .NET – Pas 2. Definire Obiect Remote
using System; public class StockMarketImpl : MarshalByRefObject, StockMarket{ public float get_price(string company){ return 12345; } Fisier StockMarketImpl.cs Se implementeaza clasa StockMarketImpl Aceasta realizeaza operatia get_price Specific .NET: Obiectul accesibil la distanta trebuie sa extinda MarshalByRefObject

23 .NET – Pas 3. Implementare Server
Se implementeaza un program StockMarketServer, care creaza un obiect de tip StockMarket, ce poate fi accesat de la distanta Obiectul creat este inregistrat sub numele “NASDAQ” using System; using System.Runtime.Remoting; using System.Runtime.Remoting.Channels; using System.Runtime.Remoting.Channels.Tcp; public class StockMarketServer{ public static void Main(){ StockMarketImpl myStockMarket = new StockMarketImpl(); TcpChannel m_TcpChan = new TcpChannel(9999); ChannelServices. RegisterChannel(m_TcpChan); RemotingServices.Marshal( myStockMarket, "NASDAQ"); System.Console.WriteLine( "Listening for requests. Press ENTER to quit"); System.Console.ReadLine(); } Specific .NET: ChannelServices RemotingServices Fisier StockMarketServer.cs

24 .NET – Pas 4. Implementare Client
Se implementeaza un program StockMarketClient, care acceseaza un obiect de tip StockMarket aflat la distanta, si invoca operatia get_price pentru un nume de companie Prin intermediul Broker se localizeaza obiectul cu numele “NASDAQ” using System; using System.Runtime.Remoting; using System.Runtime.Remoting.Channels; using System.Runtime.Remoting.Channels.Tcp; public class Client{ public static void Main(){ TcpChannel tcpChan = new TcpChannel(); ChannelServices.RegisterChannel(tcpChan); StockMarket stockMarket = (StockMarket) Activator.GetObject(typeof(StockMarket), "tcp://localhost:9999/NASDAQ"); Console.WriteLine(stockMarket.get_price( "abc SRL")); } Specific .NET: ChannelServices Activator.GetObject Fisier StockMarketClient.cs

25 .NET - Pas 5. Rulare aplicatie
> Presupunand ca Windows si .NET Framework este instalat: start StockMarketServer start StockMarketClient Codul aplicatiei exemplu poate fi download-ad de pe pagina cursului, de la sectiunea de exemple de cod pentru cursul c7: .NET Remoting StockMarket

26 .NET - Pas 6. Creare Proxy ? Crearea de Proxy este total transparenta pentru developer-ul de aplicatii Proxy se creaza automat de catre .NET Framework in timpul executiei cand un client activeaza un obiect la distanta.

27 Alte facilitati oferite de Middleware
Exemplul anterior ilustreaza doar facilitatile elementare oferite de un Broker: Inregistrarea unui serviciu la Broker Localizarea unui serviciu prin Broker Obtinerea unei referinte la un obiect la distanta In functie de fiecare tehnologie, se mai poate oferi suport si pentru unele din urmatoarele: Invocare dinamica Livrare dinamica Transferul obiectelor (inclusiv remote objects) ca parametri la serviciile la distanta – prin valoare sau referinta Activarea unui obiect la distanta Concurenta in interiorul obiectelor server Securitate Garbage collection pentru obiectele la distanta Interoperabilitatea intre clienti si servere din limbaje diferite Bridge cu alte tehnologii de Middleware

28 Alte facilitati oferite de Middleware - detalii
Invocare statica vs. Invocare dinamica Invocare statica: daca clientul cunoaste de la design-time care este interfata serviciului la distanta utilizat: Se pot genera clasele de tip ClientSideProxy pentru serviciul respectiv Clientul interactioneaza cu acest proxy Apelurile sunt hard-codate in codul sursa Invocare dinamica: daca clientul nu cunoaste la design-time care este interfata serviciului la distanta utilizat (acesta va fi descoperit la runtime) Apelurile nu pot fi hardcodate in codul sursa al clientului Solutie: un mecanism tip Reflection: orice server ofera o operatie de tip invoke, care primeste ca parametrii operatia concreta si valorile parametrilor Livrare statica vs livrare dinamica Livrare statica: Programul server cunoaste de la design-time care sunt obiectele server pe care le gazduieste Livrare dinamica: Obiecte server pot fi create dinamic la runtime ServerSideProxy poate fi unul generic, care suporta o operatie de tip invoke ca la invocarea dinamica

29 Alte facilitati oferite de Middleware – detalii (cont)
Concurenta Varianta simpla: Programul server (ServerSideProxy) contine un ciclu in care accepta cereri si le trateaza secvential Server concurent: creaza cate un thread pentru tratarea cererilor Problema: Obiectul server poate fi utilizat de thread-uri diferite in acelasi timp – poate necesita utilizarea unor mecanisme de sincronizare

30 Alte facilitati oferite de Middleware – detalii (cont)
Activarea obiectelor server Varianta simpla: Programul server creaza obiectul server, acesta exista atat timp cat ruleaza programul server Activarea obiectelor la cerere: obiectul server este creat doar daca apare prima cerere pentru el Activator: un server care: Are evidenta unde se gasesc Implementarile (clasele) din care pot fi instantiate obiecte server (Exemplu: CORBA: Implementation Repository) Are evidenta obiectelor server create Primeste cererea de la client, daca obiectul server nu exista inca - il creaza, altfel invoca operatia solicitata pe obiectul server Activator Pattern: Michael Stal, Douglas Schmidt, PLOP Exemple: Implementation repository in CORBA, rmid (Java RMI Activation System Daemon )

31 Alte facilitati oferite de Middleware – detalii (cont)
Garbage collection pentru obiectele server: Obiectele server pentru care nu mai exista nici o remote reference pot fi dezactivate Variante: Stil cooperativ: clientii anunta cand nu mai au nevoie/elibereaza referinta la server object, serverul pastreaza evidenta prin contoare Brokerul pastreaza evidenta canalelor de comunicatie care sunt active Persistent remote reference Un client poate sa detina o remote reference catre un server object, chiar daca acesta a fost oprit intre timp (accidental sau time-out) Daca clientul incearca sa acceseze obiectul server pentru care detine o referinta, broker-ul trebuie sa il reactiveze si sa il aduca in starea in care acesta a fost inainte de dezactivare sunt necesare mecanisme de salvare a starii obiectelor server, de aplicat automat inainte de dezactivare

32 Alte facilitati oferite de Middleware – detalii (cont)
Interoperability intre clienti si servere: Interface Description Languages: Exista un model comun (model orientat pe obiecte, stabileste un sistem de tipuri, operatii, interfete, exceptii) interfata obiectelor server este descrisa folosind un limbaj de descriere neutru Exista reguli (si tool-uri) care mapeaza conceptele IDL pe particularitatile unor limbaje de programare concrete

33 Bibliografie suplimentara facultativa
Frantisek Plasil, Michael Stal: An Architectural View of Distributed Objects and Components in CORBA, Java RMI, and COM/DCOM, published in Software Concepts & Tools, Springer, [POSA2]: Pattern-Oriented Software Architecture – Volume 2: Patterns for Concurrent and Networked Objects, Wiley,

34 Exercitiu Implementarea unui broker foarte simplu, gen “jucarie” - Toy-ObjectRequestBroker Se furnizeaza implementari pentru suportul de comunicare in retea la nivel de transport de octeti (ByteSender/Receiver sau Requester/Replyer) Descarcati ByteCommunication.zip de pe pagina cursului si incercati exemplele ! Exemplul 1: ServerWithSR, ClientWithSR Exemplul 2: ServerWithRR, ClientWithRR Implementarea nu va folosi alte tehnologii de Middleware Detalii cerinte => Tema 3 laborator

35 ToyORB: un client Este de dorit ca utilizand ToyORB, StockMarketClient:main sa constea in principiu in urmatoarele: StockMarket objRef=(StockMarket) ToyORB.getObjectReference(“NASDAQ”); float price=objRef.get_price(“ABC SRL”); Cauta adresa unui obiect inregistrat sub numele NASDAQ Creaza si returneaza un obiect de tip StockMarketClientSideProxy StockMarketClientSideProxy. get_price trimite catre StockMarketServerSideProxy parametrul operatiei (numele companiei cotate la bursa) si receptioneaza rezultatul (pretul curent) Reprezinta operatia send_request din Patternul Broker asa cum e definit in POSA/Fig.pg.109

36 ToyORB: un server Este de dorit ca utilizand ToyORB, StockMarketServer:main sa constea in principiu in urmatoarele: StockMarket obj=new StockMarketImpl ToyORB.register (obj, StockMarket, “NASDAQ”); Inregistreaza obj creat, care implementeaza serviciul StockMarket si are numele NASDAQ Creaza un obiect de tip StockMarketServerProxy care intra in asteptarea cererilor de la clienti

37 ToyORB: Varianta Forwarder-Receiver
2 canale de comunicatie diferite, unul pentru transmis parametri, unul pentru transmiterea rezultatului StockMarket ClientProxy deliver ( marshal ( “ABC SRL” ) unmarshal ) receive StockMarket ServerProxy F R receive ( unmarshal ( ) marshal ) deliver R F ToyORB NamingService Dezavantaj: tiparul F-R presupune participanti cu statut egal => ar trebui ca si clientii sa se inregistreze (sau ORB sa le asigneze un nr de port in mod transparent) Config.db “StockMarketClient”: IP, Port “NASDAQ”: IP, Port

38 ToyORB: Varianta Requester-Replyer
StockMarket ClientProxy StockMarket ServerProxy Marshaller Marshaller deliver_and_wait_feedback Replyer Requester receive_transform_and_send_feedback ToyORB NamingService deliver_and_wait_feedback: deliver cererea urmata de receptia rezultatului pe acelasi canal de comunicatie (socket) receive_transform_and_send_feedback: receive cererea urmata de transmiterea rezultatului pe acelasi canal de comunicatie Config.db “NASDAQ”: IP, Port

39 ToyORB: Implementare Proxy-uri
call_service send_request StockMarketServerSideProxy: Are un Replyer r Il cunoaste pe StockMarketImpl s Are un Transformer t : primeste un sir de octeti si returneaza sirul de octeti transformat Pentru a realiza operatia get_price de ori de cate ori este solicitat: While (true) r.receive_transform_and_send_feedback(t(s)); Receptioneaza sirul de octeti reprezentand parametrii, t(s) il transforma in sir de octeti de tip rezultat, care vor fi transmisi inapoi la client ServerTransformer: Are un Marshaller m Pentru a rezolva transformarea: cu ajutorul lui m – unmarshal, reconstruieste parametri de intrare (numele companiei) Apeleaza operatia de la StockMarketImpl s si obtine rezultatul Cu ajutorul lui m - marshal, transforma rezultatul (pretul) in sir de octeti StockMarketClientSideProxy: Are un Requestor r Are un Marshaller m Pentru a rezolva operatia get_price: Cu ajutorul lui m – marshal, transforma parametri de intrare(numele companiei) intr-un sir de octeti Cu ajutorul lui r - deliver_and_wait_feedback, transmite catre ServerSideProxy sirul de octeti parametru si receptioneaza un sir de octeti reprezentand rezultatul Cu ajutorul lui m - unmarshal, transforma sirul de octeti obtinut in valoarea rezultatului (pretul) pack_data forward_ request forward_ response unpack_data unpack_data Cu text rosu italics sunt identificate operatiile prin numele cu care apar in Pattern-ul Broker run_service pack_data

40 ToyORB: suport pt servere mai complexe
Este de dorit ca sa se poata accesa la distanta si obiecte care implementeaza interfete mai complexe (cu mai multe operatii). De exemplu: public interface ComplexStockMarket { float get_price (String Company); String whois_highest_today(); String whois_lowest_today(); } In acest caz, un client va putea accesa serviciile la distanta in felul urmator: ComplexStockMarket objRef=(ComplexStockMarket) ToyORB.getObjectReference(“NASDAQ”); float price=objRef.get_price(“ABC SRL”); String junk=objRef.whois_lowest_today(); Pentru aceasta, ClientSideProxy trebuie sa includa in sirul de octeti produs la operatia marshal si informatia referitoare la ce operatie s-a cerut. ServerSideProxy va deduce in operatia unmarshal despre ce operatie este vorba

41 ToyORB: Atentie la dependente !
ToyORB trebuie sa poata fi folosit pentru orice tip de aplicatii (StockMarket, ComplexStockMarket, InfoServer, MathServer, etc – si orice alt tip, necunoscut la momentul crearii ToyORB) ToyORB nu poate sa depinda deloc de cod specific aplicatiilor ! Marshaller: trebuie sa poata transforma in bytes orice combinatie de parametrii ToyORB.getObjectReference(String ServerName) trebuie sa poata sa creeze si returneze un obiect proxy client corespunzator tipului aplicatiei (StockMarketClientSideProxy, MathServerClientSideProxy, InfoServerClientSideProxy, etc), dar fara sa depinda de aceasta ! Posibila solutie: utilizarea Reflection pentru crearea obiectului de tipul corespunzator

42 Scenarii de localizare a serverelor
ToyORB.getObjectReference(“NASDAQ”); StockMarketImpl NASDAQ StockMarketClient1 StockMarketImpl NIKKEI StockMarketClient2 ToyORB.getObjectReference(StockMarket); InfoServerImpl TimisInfo ToyORB.getObjectReference(“TimisInfo”) InfoClient1

43 Scenarii de localizare a serverelor
StockMarketImpl NASDAQ StockMarketClient1 StockMarketImpl NIKKEI StockMarketClient2 InfoServerImpl TimisInfo NamingService Address , 1111 InfoClient1 NamingService NASDAQ, StockMarket, ,1112 NIKKEI, StockMarket, ,1113 TimisInfo, InfoServer, ,1114

44 Scenarii de utilizare: Inregistrare Server
StockMarketImpl NASDAQ ToyORB.register Requester NamingService Address , 1111 Inregistreaza NASDAQ de tip StockMarket La adresa , 1112 Replyer NamingService NASDAQ, StockMarket, , 1112

45 Scenarii de utilizare: Serverul ready
StockMarketImpl NASDAQ StockMarketClient1 StockMarketServerProxy Replyer NamingService Address , 1111 Replyer NamingService NASDAQ, StockMarket, , 1112

46 Scenarii de utilizare: getObjectReference
StockMarketImpl NASDAQ StockMarketClient1 StockMarketServerProxy Replyer ToyORB.getObjectRef Requester NamingService Address , 1111 1112 Adresa NASDAQ ? Replyer NamingService NASDAQ, StockMarket, , 1112

47 Scenarii de utilizare: s-a obtinut referinta
StockMarketImpl NASDAQ StockMarketClient1 StockMarketServerProxy StockMarketClientProxy Replyer Requester NamingService Address , 1111 Replyer NamingService NASDAQ, StockMarket, , 1112

48 ToyORB: Implementare NamingService
NamingService mai complex (Trader): Localizarea unui obiect la distanta se face dupa numele sau (“NASDAQ”) Localizarea unui obiect la distanta se face dupa descrierea serviciului pe care il furnizeaza (StockMarket) -> se obtine o referinta spre unul din obiectele inregistrate ca furnizand acest serviciu Implementarea NamingService: sub forma de server care are o adresa fixa cunoscuta de catre ToyORB ToyORB:getObjectReference ToyORB:register Interactioneaza fiecare cu NamingService dupa tiparul Requester-Replyer

49 Scopul unui ORB Un Object Request Broker este o infrastructura pentru dezvoltarea de aplicatii distribuite: Se refoloseste ca infrastructura in MULTE aplicatii DIFERITE, NECUNOSCUTE dezvoltatorului sau! Consecinte: Esential: ORB NU poate depinde in nici un fel de cod specific acestor aplicatii Pentru cresterea “usability”: este de dorit ca Broker-ul sa sprijine dezvoltatorul de aplicatii si in problema scrierii proxy-urilor Tool-uri pentru generarea automata a proxy-urilor

50 ToyORB: Generarea automata a proxy-urilor
Punct de start: scrieti manual proxy-urile pentru cel putin 2 aplicatii diferite, pentru a identifica un Template comun

51 ToyORB: Implementare Proxy-uri StockMarket
call_service send_request StockMarketServerSideProxy: Are un Replyer r Il cunoaste pe StockMarketImpl s Are un Transformer t : primeste un sir de octeti si returneaza sirul de octeti transformat Pentru a realiza operatia get_price de ori de cate ori este solicitat: While (true) r.receive_transform_and_send_feedback(t(s)); Receptioneaza sirul de octeti reprezentand parametrii, t(s) il transforma in sir de octeti de tip rezultat, care vor fi transmisi inapoi la client ServerTransformer: Are un Marshaller m Pentru a rezolva transformarea: cu ajutorul lui m – unmarshal, reconstruieste parametri de intrare (numele companiei) Apeleaza operatia de la StockMarketImpl s si obtine rezultatul Cu ajutorul lui m - marshal, transforma rezultatul (pretul) in sir de octeti StockMarketClientSideProxy: Are un Requestor r Are un Marshaller m Pentru a rezolva operatia get_price: Cu ajutorul lui m – marshal, transforma parametri de intrare(numele companiei) intr-un sir de octeti Cu ajutorul lui r - deliver_and_wait_feedback, transmite catre ServerSideProxy sirul de octeti parametru si receptioneaza un sir de octeti reprezentand rezultatul Cu ajutorul lui m - unmarshal, transforma sirul de octeti obtinut in valoarea rezultatului (pretul) pack_data forward_ request forward_ response unpack_data unpack_data Cu text rosu italics sunt identificate operatiile prin numele cu care apar in Pattern-ul Broker run_service pack_data

52 ToyORB: Template-uri pentru proxy
Se presupune un server cu interfata ServiceX ServiceXClientSideProxy: Class ServiceXClientSideProxy implements ServiceX Fiecare operatie definita in interfata ServiceX este implementata in felul urmator: Creaza mesajul (marshal): numele operatiei, (numarul si tipurile parametrilor), valorile parametrilor Deliver_and_wait_feedback Extrage din mesajul de raspuns valoarea rezultatului (conform tipului returnat de operatie) si o returneaza Observatie: ServiceXClientSideProxy este o clasa care implementeaza interfata ServiceX ! Varianta1 (general aplicabila): tipul ServiceX este cunoscut de dinainte, Codul pentru ServiceXClientSideProxy este generat automat in faza de design si este instalat pe calculatorul clientului (Exemple: CORBA, RMI in java 1.1) Varianta2 (pentru tehnologii care suporta dynamic class loading): codul pentru ServiceXClientSideProxy este generat automat, dar nu trebuie pre-instalat pe fiecare calculator client de dinainte, ci poate fi download-at dinamic la runtime (Exemplu RMI) Varianta 3 (pentru tehnologii care suporta forme de run time code generation - dynamic proxy): codul clasei ServiceXClientSideProxy este generat automat la runtime (nu trebuie utilizate tool-uri de generare in faza de design), (Exemple: RMI in java dupa1.5 si .NET Remoting)

53 ToyORB: Template-uri pentru proxy (cont)
Se presupune un server cu interfata ServiceX ServiceXServerSideProxy: Class ServiceXServerSideProxy: are o referinta la obiectul server ServerXImpl Contine “server-loop” (while (true) receive_transform_sendfeedback) Class ServiceXServerTransformer implements ServerTransformer Primeste referinta la obiectul server ServerXImpl Extrage din mesajul primit (unmarshal) numele operatiei si valorile parametrilor Invoca operatia pe obiectul server Varianta 1: secventa de cod de tip “switch-case” (Java 1.1, CORBA) Varianta 2: prin Reflection -> nu mai depinde de tipul ServiceX -> devine un ServerSideProxy generic (Java 1.2, .NET) Creaza mesajul de raspuns(marshal) cu rezultatul invocarii operatiei

54 ToyORB: Generarea automata a proxy-urilor
Posibilitati de generare automata a proxy-urilor: In mod diferit in RMI, CORBA, .NETRemoting RMI-style (in varianta java.rmi.server.ignoreStubClasses = false): Tool de generare (echivalent lui rmic) Intrare: Implementarea obiectului remote (class). Poate fi analizat prin reflection. Iesire: fisiere sursa proxy-uri (denumite dupa o conventie de numire), care vor fi compilate si link-uite cu clientul respectiv serverul CORBA-style: Tool de generare (echivalent lui idl2java) Intrare: Interfata obiectului remote. Poate fi analizata cu parsing de text. Iesire: ca si in cazul anterior, fisiere sursa proxy-uri (denumite dupa o conventie de numire), care vor fi compilate si link-uite cu clientul respectiv serverul

55 ToyORB: Generarea automata a proxy-urilor (cont)
Posibilitati de generare automata a proxy-urilor: In mod diferit in RMI, CORBA, .NETRemoting .NET Remoting-style sau RMI (in varianta java.rmi.server.ignoreStubClasses =true) Existenta Proxy-urilor este complet transparenta pentru dezvoltatorul de aplicatii Broker-ul creaza in mod dinamic clasele pentru proxy-uri si apoi le instantiaza Dynamic proxy Java.lang.reflect.Proxy .NET emit

56 ToyORB: activarea obiectului remote
In exemplul discutat pana acum, utilizatorul middleware-ului ToyORB are sarcinile: Sa implementeze remote object – StockMarketImpl Sa implementeze un program server StockMarketServer care creaza remote object de tip StockMarketImpl si sa lanseze in executie acest program - StockMarketServer Sa implementeze programe client care utilizeaza remote interface StockMarket – StockMarketClient Alternativa la pct. 2 : ToyORB creaza si activeaza un remote object la cererea unui client! Utilizatorul nu mai trebuie sa asigure pornirea unui program server Dezvoltatorul StockMarketImpl trebuie doar sa informeze ToyORB despre faptul ca exista si unde se gaseste implementarea sa (din care poate fi instantiat) Bibliografie suplimentara: Activator Pattern: Michael Stal, Douglas Schmidt, PLOP 2005

57 Scenarii de utilizare cu activare automata: Inregistrare Server
Fisiere .class ImplemRegistrationTool Requester NamingService Address , 1111 Inregistreaza implementarea: NASDAQ de tip StockMarket Implementare disponibila la: adresa calculator , fisier C:\Progs\StockMarketImpl.class, (C:\Progs\StockMarketServerProxy.class) port Activator: 1112 Replyer NamingService NASDAQ, StockMarket, , 1112 neactivat, c:\Progs\StockMarketImpl.class, c:\Progs\StockMarketServerProxy.class

58 Scenarii de utilizare cu activarea automata: Serverul ready
Fisiere .class StockMarketClient1 NamingService Address , 1111 Replyer Activator Replyer NamingService NASDAQ, StockMarket, , 1112 neactivat, c:\Progs\StockMarketImpl.class, c:\Progs\StockMarketServerProxy.class

59 Scenarii de utilizare cu activarea automata: getObjectReference
Fisiere .class StockMarketImpl StockMarketClient1 StockMarketServerProxy Replyer ToyORB.getObjectRef Requester NamingService Address , 1111 Replyer Adresa NASDAQ ? StockMarket Activator 1113 1113 Replyer Requester NamingService NASDAQ, StockMarket, , 1112 , neactivat, c:\Progs\StockMarketImpl.class, c:\Progs\StockMarketServerProxy.class 1113 activat

60 Scenarii de utilizare cu activarea automata: s-a obtinut referinta
Fisiere .class StockMarketImpl StockMarketClient1 StockMarketServerProxy StockMarketClientProxy Replyer Requester NamingService Address , 1111 Replyer Activator Replyer Requester NamingService NASDAQ, StockMarket, , 1112 , neactivat, c:\Progs\StockMarketImpl.class, c:\Progs\StockMarketServerProxy.class 1113 activat

61 Tema 3 - ToyORB Cerinte standard: (termen: sapt 11)
Cerinta minima (pentru nota 5): Scrierea unui program StockMarketClient si a unui program StockMarketServer, direct peste tiparul ByteSender-Receiver sau Requestor/Replyer Pentru nota 7: in plus fata de punctul 1, se va realiza un server NamingService Pentru nota 8: in plus fata de punctele 1 si 2, se va realiza implementarea Proxy-urilor Client si Server pentru aplicatia StockMarket simpla (care exporta un singur serviciu, get_price). Pentru nota 9: Ca si la punctul anterior, dar aplicatia va fi de tip ComplexStockMarket, care ofera pe langa serviciul get_price si serviciile get_highest si get_lowest, returnand numele companiilor cel mai bine/cel mai slab cotate la momentul curent. Pentru nota 10: ToyORB poate suporta orice alte tipuri de aplicatii (toate dependentele de tipul aplicatiei au fost eliminate din ToyORB). Se va implementa inca o alta aplicatie diferita in afara de ComplexStockMarket. NamingService prezinta capabilitati de Trader. Cerinte optionale - "puncte bonus”: (termen: sapt 12) generarea automata a codului proxy-urilor. Sunt posibile una din variantele: Implementarea unui tool generator de proxy-uri: genereaza codul sursa pentru Proxy pornind de la interfata obiectului remote sau pornind de la implementarea obiectului remote (0.5 punct bonus examen) generarea proxy-urilor la runtime prin mecanismul de dynamic proxy (1 punct bonus examen) activarea automata a obiectelor remote, la cererea clientilor, si dezactivarea lor cand nu mai sunt utilizate de nici un client (Implementare Activator, extindere NamingService) (1 punct bonus examen)


Download ppt "Broker in practica: Middleware"

Similar presentations


Ads by Google