Title: Broker in practica: Middleware
1Broker in practica Middleware
Tool Generare Proxy-uri
Biblioteca(API) Executabile
Application Developer
2Implementari 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
3Arhitectura comuna
Server
Client
implements
Remote Interface
Remote Object
uses
implements
ClientSide Proxy
ServerSide Proxy
Broker
4Exemplu
- 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
5Pasi 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
6RMI Arhitectura
Server
Client
implements
Remote Interface
Remote Object
uses
implements
Stub (ClientSide Proxy)
Skeleton (ServerSide Proxy)
Remote Reference Layer
Transport Layer
7RMI - 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
8RMI - 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 price12345
- return price
-
-
- Specific RMI
- Implementarea trebuie sa extinda
UnicastRemoteObject
Fisier StockMarketImpl.java
9RMI - Pas 3. Generare Proxy-uri
- RMI Stub/Skeleton
- Se genereaza automat din implementarea obiectului
server - gtrmic 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
10RMI - 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)
-
-
Fisier StockMarketServer.java
11RMI - 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 pricemarket.get_price("ABC SRL")
-
- System.out.println("Price is "price)
- catch (Exception e)
- System.out.println("Exception !")
-
-
- Specific RMI
- Naming.lookup
Fisier StockMarketClient.java
12RMI - Pas 6. Rulare aplicatie
RMI Registry non-persistent Naming Service
- gt start rmiregistry
- gt start java StockMarketServer
- gt 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
13CORBA Arhitectura
Server
Client
Remote Interface IDL
Remote Object
IDL Stub (ClientSide Proxy)
IDL Skeleton (ServerSide Proxy)
Dynamic Invocation Interface
Object Adapter
ORB Interface
Implem Repository
Interface Repository
ORB (Object Request Broker)
14CORBA - 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
15CORBA - Pas 2. Generare Proxy-uri
- CORBA IDL Stub/Skeleton
- Se genereaza automat din definitia interfetei IDL
- gt idl2java StockMarket.idl
- Rezulta clasele/fisierele
- Client Stub _st_StockMarket.java
- Server Stub _StockMarketImplBase.java
16CORBA - 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 price12345
- 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
17CORBA - Pas 4. Implementare Server
- import org.omg.CORBA.
- Import SimpleStocks.
- public class StockMarketServer
- public static void main(String args)
- try
- ORB orbORB.init()
- BOA boaorb.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
Fisier StockMarketServer.java
18CORBA - Pas 5. Implementare Client
- import org.omg.CORBA.
- import SimpleStocks.
- public class StockMarketClient
- public static void main(String args)
- try
- ORB orbORB.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
19CORBA - Pas 6. Rulare aplicatie
Location service (numele OSAgent e specific unei
anumite implementari CORBA)
- gt 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//localhost9999/NASDAQ") - Console.WriteLine(stockMarket.get_price(
-
"abc SRL")) -
-
- Specific .NET
- ChannelServices
- Activator.GetObject
Fisier StockMarketClient.cs
25.NET - Pas 5. Rulare aplicatie
- gt 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.
27Alte 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
28Alte 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
29Alte 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
30Alte 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 2005 http//www.stal.de/Downloads/Activator.p
df - Exemple Implementation repository in CORBA, rmid
(Java RMI Activation System Daemon )
31Alte 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
32Alte 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
33Bibliografie 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, 1998.
http//dissertations.ub.rug.nl/FILES/faculties/sci
ence/2007/m.stal/c3.pdf
- POSA2 Pattern-Oriented Software Architecture
Volume 2 Patterns for Concurrent and Networked
Objects, Wiley, 2000. http//www.cs.wustl.edu/sch
midt/POSA/POSA2/
34Exercitiu
- 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 gt Tema 3 laborator
http//bigfoot.cs.upt.ro/ioana/arhit/laborator.ht
ml
35ToyORB un client
- Este de dorit ca utilizand ToyORB,
StockMarketClientmain sa contina in principiu
urmatoarele - StockMarket objRef(StockMarket)
- ToyORB.getObjectReference(NASDAQ)
- float priceobjRef.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,
StockMarketServermain sa contina in principiu
urmatoarele - StockMarket objnew 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
37ToyORB Varianta Forwarder-Receiver
2 canale de comunicatie diferite, unul pentru
transmis parametri, unul pentru transmiterea
rezultatului
StockMarket ClientProxy
StockMarket ServerProxy
deliver ( marshal ( ABC SRL ) unmarshal )
receive
F
R
receive ( unmarshal ( 1234.5 ) marshal ) deliver
R
F
ToyORB NamingService
Dezavantaj tiparul F-R presupune participanti
cu statut egal gt 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
38ToyORB 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
39ToyORB 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_feed
back(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
40ToyORB 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 priceobjRef.get_price(ABC SRL)
- String junkobjRef.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, InfoServerClientSidePro
xy, 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 127.0.0.1, 1111
InfoClient1
NamingService
NASDAQ, StockMarket,127.0.0.1,1112 NIKKEI,
StockMarket, 127.0.0.1,1113 TimisInfo,
InfoServer, 127.001,1114
44 Scenarii de utilizare Inregistrare Server
StockMarketImpl NASDAQ
ToyORB.register
Requester
NamingService Address 127.0.0.1, 1111
Inregistreaza NASDAQ de tip StockMarket La adresa
127.0.0.1, 1112
Replyer
NamingService
NASDAQ, StockMarket, 127.0.0.1, 1112
45 Scenarii de utilizare Serverul ready
StockMarketImpl NASDAQ
StockMarketClient1
StockMarketServerProxy
Replyer
NamingService Address 127.0.0.1, 1111
Replyer
NamingService
NASDAQ, StockMarket, 127.0.0.1, 1112
46 Scenarii de utilizare getObjectReference
StockMarketImpl NASDAQ
StockMarketClient1
StockMarketServerProxy
Replyer
ToyORB.getObjectRef
Requester
NamingService Address 127.0.0.1, 1111
1112
Adresa NASDAQ ?
Replyer
NamingService
NASDAQ, StockMarket, 127.0.0.1, 1112
47 Scenarii de utilizare s-a obtinut referinta
StockMarketImpl NASDAQ
StockMarketClient1
StockMarketServerProxy
StockMarketClientProxy
Replyer
Requester
NamingService Address 127.0.0.1, 1111
Replyer
NamingService
NASDAQ, StockMarket, 127.0.0.1, 1112
48ToyORB 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) -gt 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 - ToyORBgetObjectReference
- ToyORBregister
Interactioneaza fiecare cu NamingService dupa
tiparul Requester-Replyer
49Scopul 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
50ToyORB Generarea automata a proxy-urilor
- Punct de start scrieti manual proxy-urile pentru
cel putin 2 aplicatii diferite, pentru a
identifica un Template comun
51ToyORB 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_feed
back(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
52ToyORB 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 ServiceXClientSidePro
xy 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)
53ToyORB 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 -gt nu mai depinde de
tipul ServiceX -gt devine un ServerSideProxy
generic (Java 1.2, .NET) - Creaza mesajul de raspuns(marshal) cu rezultatul
invocarii operatiei
54ToyORB 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.ignoreStubC
lasses 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
55ToyORB 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 http//download.oracle.com
/javase/1.3/docs/guide/reflection/proxy.html - .NET emit http//msdn.microsoft.com/en-us/libr
ary/5kyyyeh2.aspx