sisteme distribuite – tehnologiistaff.fmi.uvt.ro/~dana.petcu/distrib/tds10-ro.pdf · dezvoltarea...

24
Sisteme distribuite – Tehnologii 10. Servicii de date (JDO & SDO) si arhitectura bazata pe componente servicii (SCA) Decembrie 18, 2009

Upload: others

Post on 04-Nov-2019

10 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Sisteme distribuite – Tehnologiistaff.fmi.uvt.ro/~dana.petcu/distrib/TDS10-RO.pdf · dezvoltarea de retele de aplicatii orientate spre servicii, adresand probleme de afaceri reale

Sisteme distribuite – Tehnologii10. Servicii de date (JDO & SDO) si arhitecturabazata pe componente servicii (SCA)

Decembrie 18, 2009

Page 2: Sisteme distribuite – Tehnologiistaff.fmi.uvt.ro/~dana.petcu/distrib/TDS10-RO.pdf · dezvoltarea de retele de aplicatii orientate spre servicii, adresand probleme de afaceri reale

Java Data Objects (JDO) Acceseaza data utilizand o intrefata standard bazata pe modelul de persistenta in Java, Java Data Objects (JDO). Specificatia originala (1.0) a fost realizata de Sun iar incepand cu 2.0, dezvoltarea API si a implementarii de referinta este un proiect open-source Apache.Uzual se progrmeaza obtinerea datelor pe baza JDBC, -> De ce este nevoie de un nou standard, JDO?

Porneste de la studii de caz de afaceri si apoi se realizeaza o analiza de afaceri ajungandu-se la Business Domain Object Model (BDOM).

BDOM va conduce designul claselor entitati, care vor persista la o capacitate de stocare adecvata.

Proiectarea claselor entitate si relatiilor saleEste necesara scrierea de cod pentru crearea tabelelor, si pentruinterogarea datelor din aceste tabele sau capacitati de stocare

Este preferabil ca raspunsul sa fie 'No' la aceasta intrebare, deoarece estesesucentibil la erori si consturi in timpAzi este utilizat JDBC pentru a asigura “functionalitatile tehnice", si maine potese doreste schimbarea JDBC cu un alt standard deoarece se doreste trecereade la o stocare reltionala la un mecanism de persistenta diferit

Page 3: Sisteme distribuite – Tehnologiistaff.fmi.uvt.ro/~dana.petcu/distrib/TDS10-RO.pdf · dezvoltarea de retele de aplicatii orientate spre servicii, adresand probleme de afaceri reale

Fcilitatile JDO

Separarea compararilor: Dezvoltatorii de aplicatii se pot concentra la BDOM si sa lase detaliile persistentei (stocare & regasire) la implementarea JDOBazat pe API: JDO este bazat pe modelul de programare a interfetelor Java => Toate comportarile de persistenta incluzand majoritatea facilitatilor utilizatein comun pentru maparea OR sunt disponibile ca metadata, extern pentrucodul sursa BDOM. => Exista posibilitatea de multiple Plug and Play implementari de JDO.Portabilitatea capacitatii de stocare a datelor: independent daca estevorba daca stocarea persistenta este relationala sau un fisier bazat peobiecte, sau un XML DB sau un fisier simplu, implementarile JDO pot suportcodul =>applicatiile JDO sunt idenpendente de baza de date.Performanta: O implementare JDO specifica cunoaste tipul de stocare, ceeace va imbunatati performnta comparativ cu un cod dezvotat de un programator.Integrare J2EE: aplicatiile JDO pot sa exploateze facilitatile J2EE precumEJB, procesare de mesaje la distanta, coordonarea automata a tranzactiilordistribuite, securitate, etc

Page 4: Sisteme distribuite – Tehnologiistaff.fmi.uvt.ro/~dana.petcu/distrib/TDS10-RO.pdf · dezvoltarea de retele de aplicatii orientate spre servicii, adresand probleme de afaceri reale

JDO utilizand JPOX

JPOX (Java Persistent Objects): proiect Apache open-source, care are ca scop o solutie eterogena persistenta pentru Java folosind JDO. JPOX JDO support any combination of 4 main aspects of persistence:

1. Definitia persistentei: Mecanismul de definire cu clasele BDOM vor fipersistente in capacitatea de stocare.

2. APIul persistentei: API de programare utilizat pentru a ca obiecteleBDOM sa persiste.

3. Limbajul de interogare: Limbajul utilizat pentru a gasi obiecteledatorita cf. unui criteriu.

4. Capacitatea de stocare: Capacitatea de stocare persistenta in care se obiectele sunt scrise.

Page 5: Sisteme distribuite – Tehnologiistaff.fmi.uvt.ro/~dana.petcu/distrib/TDS10-RO.pdf · dezvoltarea de retele de aplicatii orientate spre servicii, adresand probleme de afaceri reale

ExempluDoua clase entitati: OrderList and LineItemBDOM ilustreaza ca

un Order poate contine mai multe itemuri-linie.Fiecare item-linie este legata de un singur Order.

Clasele BDOM:

Page 6: Sisteme distribuite – Tehnologiistaff.fmi.uvt.ro/~dana.petcu/distrib/TDS10-RO.pdf · dezvoltarea de retele de aplicatii orientate spre servicii, adresand probleme de afaceri reale

ExempluOrderList este o clasa care reprezinta Order, si are

un atribut cheie orimara care este un numar

public class OrderList{private int number;private Date orderDate;private Set lineItems;// other getter & setter methods go here// Inner class for composite PKpublic static class Oid implements Serializable{

public int number;public Oid(){ }public Oid(int param) { this.number = param; }

public String toString(){ return String.valueOf(number); }

public int hashCode() { return number; }public boolean equals(Object other){

if (other != null && (other instanceof Oid)){Oid k = (Oid)other;return k.number == this.number;

}return false;

}}

}

LineItem reprezinta fiecare contaier de itemuriin Order. Nu se deineste o cheie primarapentru pentru LineItem chiar daca JDO are mecanismele proprii pentru a face acestlucru.

public class LineItem{private String productId;private int numberOfItems;private OrderList orderList;// other getter & setter methods go here

}

Page 7: Sisteme distribuite – Tehnologiistaff.fmi.uvt.ro/~dana.petcu/distrib/TDS10-RO.pdf · dezvoltarea de retele de aplicatii orientate spre servicii, adresand probleme de afaceri reale

Fisierul de configurare JDOFisierul de configurare XMLdefineste campurile care trebuie sa fie persistente si la care wrapperul JDBC sau JDO trebuiesa fie mapat. Necesara crearea unui fisier XML numit package.jdo care sa fie in acelasi director in care exista intrarile.

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE jdo SYSTEM "file:/javax/jdo/jdo.dtd"><jdo>

<package name="com.binildas.jdo.jpox.order"><class name="OrderList" identity-type="application"

objectid-class="OrderList$Oid" table="ORDERLIST"><field name="number" primary-key="true">

<column name="ORDERLIST_ID"/></field><field name="orderDate">

<column name="ORDER_DATE"/></field><field name="lineItems" persistence-modifier="persistent"

mapped-by="orderList"><collection element-type="LineItem"></collection>

</field></class><class name="LineItem" table="LINEITEM">

<field name="productId"><column name="PRODUCT_ID"/>

</field><field name="numberOfItems">

<column name="NUMBER_OF_ITEMS"/></field><field name="orderList" persistence-modifier="persistent">

<column name="LINEITEM_ORDERLIST_ID"/></field>

</class></package>

</jdo>

Page 8: Sisteme distribuite – Tehnologiistaff.fmi.uvt.ro/~dana.petcu/distrib/TDS10-RO.pdf · dezvoltarea de retele de aplicatii orientate spre servicii, adresand probleme de afaceri reale

ExempluEntitatile vor fi persistente intr-o baza de date

Oracle. Se specifica parametrii de conectarein fisierul jpox.PROPERTIES.

javax.jdo.PersistenceManagerFactoryClass=org.jpox.jdo.JDOPersistenceManagerFactory

javax.jdo.option.ConnectionDriverName=oracle.jdbc.driver.OracleDriver

javax.jdo.option.ConnectionURL=jdbc:oracle:thin:@127.0.0.1:1521:orcl

javax.jdo.option.ConnectionUserName=scottjavax.jdo.option.ConnectionPassword=tiger

org.jpox.autoCreateSchema=trueorg.jpox.validateTables=falseorg.jpox.validateConstraints=false

Main class contine codul de testare a functionalitatilorJDO.

Creaza doua Order si adaugacateva linii la fiecare.Stocheaza aceste date Interogheaza aceste entitati utilizand idul.

public class Main{static public void main(String[] args){

Properties props = new Properties();try{

props.load(new FileInputStream("jpox.properties"));}catch (Exception e){ e.printStackTrace();}PersistenceManagerFactory pmf =

JDOHelper.getPersistenceManagerFactory(props);PersistenceManager pm = pmf.getPersistenceManager();Transaction tx = pm.currentTransaction();Object id = null;try{

tx.begin();LineItem lineItem1 = new LineItem("CD011", 1);LineItem lineItem2 = new LineItem("CD022", 2);OrderList orderList = new OrderList(1, new Date());orderList.getLineItems().add(lineItem1);orderList.getLineItems().add(lineItem2);LineItem lineItem3 = new LineItem("CD033", 3);LineItem lineItem4 = new LineItem("CD044", 4);OrderList orderList2 = new OrderList(2, new Date());orderList2.getLineItems().add(lineItem3);orderList2.getLineItems().add(lineItem4);pm.makePersistent(orderList);id = pm.getObjectId(orderList);System.out.println("Persisted id : "+ id);pm.makePersistent(orderList2);id = pm.getObjectId(orderList2);System.out.println("Persisted id : "+ id);orderList = (OrderList) pm.getObjectById(id);System.out.println("Retreived orderList : " + orderList);tx.commit();

}catch (Exception e){ e.printStackTrace(); if (tx.isActive()){ tx.rollback(); } }finally{ pm.close(); }

}}

Page 9: Sisteme distribuite – Tehnologiistaff.fmi.uvt.ro/~dana.petcu/distrib/TDS10-RO.pdf · dezvoltarea de retele de aplicatii orientate spre servicii, adresand probleme de afaceri reale

LOB, CDM si Data Services Cand se definesc strategii SOA la nivel de companii, sunt tratate sisteme Line of Business (LOB);

Unele dintre ele se vor ferei la aceeasi entitate de afaceriDe exemplu, o entitate client este necesar pentru un sistem de vanzare si pentru un sistemde publicitate

Acesta necesita un Common Data Model (CDM), care este adesea referit ca un Canonical Data Model sau Model informational.

Intr-un asemenea model, adesea vor fi entitati care reprezinta concepte “domenii", de exemplu, client, cont, adresa, ordin, etc. Astfel, sisteme LOB multiple va utiliza aceste entitati de domenii in modalitati diferitedepinzand de context

Data Services sunt specializari ale WSurilor care sunt orientate spre date siinformatii.

Trebuie sa trateze operatiile CRUD (Create, Read, Update, si Delete) precum si alte date de functionare precum o cautare si modelare de informare. Operatia Create poate da inapoi un ID unica cand sunt efectuate operatiile Read, Update, siDelete pe un identificator ID. Cautarea realizata cu anumite forme de criterii de cautare sau modelarea informatiei sauregasirea sa intampla cand este solicitata o informatie utila

Page 10: Sisteme distribuite – Tehnologiistaff.fmi.uvt.ro/~dana.petcu/distrib/TDS10-RO.pdf · dezvoltarea de retele de aplicatii orientate spre servicii, adresand probleme de afaceri reale

XQuery si XPath

Expresiile XQuery sau XPath, similar cu capabilitatile SQL asupradetelor relationale, pentru documente XMLExemplu: obtine starea ordinului pentru un client particular (getCustomerOrderStatus()) cu argument IDul clientului.

Nivelul de servicii de date va necesita o operatie de regasire pa bazaIDului clientului si specificarea XQuery sau XPath va obtineinformatia solicitataNivelele de procesare de nivel inalt (ex. Nivelul serviciului LOB) pot utiliza interfete de nivel inalt (ex. Operatia getCustomerOrderStatus) folosind o interfata a WS (servicii de date) si nu trebuie sa cunoascasau utilizeze direct XQuery sau XPath. XQuery sau XPath pot fi incapsulate, reutilizate, si optimizate.

Page 11: Sisteme distribuite – Tehnologiistaff.fmi.uvt.ro/~dana.petcu/distrib/TDS10-RO.pdf · dezvoltarea de retele de aplicatii orientate spre servicii, adresand probleme de afaceri reale

Service Data Objects (SDO)

Incearca sa rezolve problema maniera eterogena de administrare a datelorPrin administrarea detlor se intelege stocareadatelor si operatiile in ciclul de viata a datlorSDO ofera dezvoltatorilor un API, SDO API, si un model de model de programare pentru accesareadatelor

Acest API permite lucrul cu date din surse de date eterogene, incluzand RDBMS, entitati EJB, surse XML, web services, surse de date EIS utilizand Java Connector Architecture, etc. Un dezvoltator nu trebuie sa fie familiar cu un API tehnologic specific precum JDBC sau XQuery pentru a accesa si utiliza datele – in loc se utilizeaza SDO API.

Page 12: Sisteme distribuite – Tehnologiistaff.fmi.uvt.ro/~dana.petcu/distrib/TDS10-RO.pdf · dezvoltarea de retele de aplicatii orientate spre servicii, adresand probleme de afaceri reale

Arhitectura SDOIn SDO, datele sunt organizate in grafuri de obiecte, DataObject.

Un DataObject este o componenta fundamentala care este oreprezentarea unei date structurate cu anumite proprietati. Aceste proprietati pot avea fir o valoare fie valori multiple, si valorile lorpot fi chiar DataObjects. Fiecare DataObject mentine de asemenea un sumar de schimbari, care reprezinta alteratii realizate asupra sa.

Un Data Mediator Service (DMS) este responsabilCrearea unui graf de date din surse de date, siActualizarea surselor de date bazandu-se pe orice schimbare in graful de dateUn DMS va crea un Data Graph, care este un container pentru un arborea obiectelor data.

Un singur graf de date poate reprezenta date din diferite surse de date.

Acesta este un model de proiectare pentru tratarea scenariilor de agregare a satelor de la surse de date multiple. Grafurile de date formeaza bazele arhitecturii disconectate a SDO, deoarce pot trece printre nivele intr-o aplicatie – sunt serializate in format XML.

Clientii SDO sunt deconectati de la DMS si de la sursa de date.Un Change Summary contine orice informatie de schimbare legatade datele din obiectul data.

Este initial vid si este popular cand graful de date este modificat.

Page 13: Sisteme distribuite – Tehnologiistaff.fmi.uvt.ro/~dana.petcu/distrib/TDS10-RO.pdf · dezvoltarea de retele de aplicatii orientate spre servicii, adresand probleme de afaceri reale

Utilizarea Apache Tuscany SDO

Apache Tuscany SDO este un subproiect al open-source Apache Tuscany. Tuscany defineste o infrastructura care simplificadezvoltarea de retele de aplicatii orientate spreservicii, adresand probleme de afaceri realeEste bazat pe specificatii definite de OASIS Open Composite Services Architecture (CSA) Member Section, care propune standarde deschise care simplifica dezvoltarea aplicatiilor SOA. Tuscany SDO ofer implementari in Java si C++.

Ambele sunt disponibile pentru descarcare la: http://incubator.apache.org/tuscany/.

Page 14: Sisteme distribuite – Tehnologiistaff.fmi.uvt.ro/~dana.petcu/distrib/TDS10-RO.pdf · dezvoltarea de retele de aplicatii orientate spre servicii, adresand probleme de afaceri reale

Exemplu

SDO poate trata surse de date eterogene, dar in exemplul urmator se va utiliza un sigur fisier XML ca sursa de date. Exemplul va citi si scie un fisier XML, iar programulclient va utiliza SDO API pentru operatiile pe date.Necesitatile pentru rularea exemplului in SDO:

un fisier schema XSDUn fisier instanta XML.

Se considera doua programe Java, Unul care citeste XMLulUnul care creaza un XML.

Page 15: Sisteme distribuite – Tehnologiistaff.fmi.uvt.ro/~dana.petcu/distrib/TDS10-RO.pdf · dezvoltarea de retele de aplicatii orientate spre servicii, adresand probleme de afaceri reale

Exemplu – fisier xsdhr.xsd restrictioneaza structura un fisier XML al angajatului care contine mai multi angajati. Fiecare angajat are un nume, adresa, organizatie.Fiecare dintre aceste elemente poate sa aiba sub-elemente:

<?xml version="1.0"?><xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://www.binildas.com/apache/tuscany/sdo/sample" targetNamespace="http://www.binildas.com/apache/tuscany/sdo/sample">

<xsd:element name="employees"><xsd:complexType>

<xsd:sequence><xsd:element ref="employee" maxOccurs="unbounded" />

</xsd:sequence></xsd:complexType>

</xsd:element><xsd:element name="employee">

<xsd:annotation><xsd:documentation>Employee representation</xsd:documentation>

</xsd:annotation><xsd:complexType>

<xsd:sequence><xsd:element name="name" type="xsd:string" /><xsd:element ref="address" maxOccurs="2" /><xsd:element ref="organization" /><xsd:element ref="office" />

</xsd:sequence><xsd:attribute name="id" type="xsd:integer" />

</xsd:complexType></xsd:element><xsd:element name="organization">

<xsd:complexType><xsd:sequence>

<xsd:element name="name" type="xsd:string"/></xsd:sequence><xsd:attribute name="id" type="xsd:integer" />

</xsd:complexType></xsd:element><xsd:element name="office">

<xsd:complexType>…

Page 16: Sisteme distribuite – Tehnologiistaff.fmi.uvt.ro/~dana.petcu/distrib/TDS10-RO.pdf · dezvoltarea de retele de aplicatii orientate spre servicii, adresand probleme de afaceri reale

Exemplu – fisier xmlhr.xml este constarns de schema de mai inainte. Fisierul XML comtine date despre doi angajati:

<?xml version="1.0"?><employees xmlns="http://www.binildas.com/apache/tuscany/sdo/sample">

<employee id="30379"><name>Binildas C. A.</name><address> <street1>45 Bains Compound Nanthencode</street1> <city>Trivandrum</city> <state>KL</state> <zip-code>695003</zip-code> </address><organization id="08"> <name>Software</name> </organization><office id="31“> <address> <street1>101 Camarino Ruiz</street1> <street2>Apt 2 Camarillo</street2> <city>Callifornia</city> <state>LA</state>

<zip-code>93012</zip-code> </address> </office></employee>

<employee id="30380"><name>Rajesh R V</name><address>

<street1>1400 Salt Lake Road</street1><street2>Appartment 5E</street2><city>Boston</city><state>MA</state><zip-code>20967</zip-code>

</address><organization id="15">

<name>Research</name></organization><office id="21">

<address><street1>2700 Cambridge Drive</street1><city>Boston</city><state>MA</state><zip-code>20968</zip-code>

</address> </office>

</employee>

</employees>

Page 17: Sisteme distribuite – Tehnologiistaff.fmi.uvt.ro/~dana.petcu/distrib/TDS10-RO.pdf · dezvoltarea de retele de aplicatii orientate spre servicii, adresand probleme de afaceri reale

Exemplu - ReadEmployees classClasa de mai jos: citeste fisierul XML, mentionat anterior, si il incarca intr-o radacina DataObject. Un DataObject este un graf de alte obiecte DataObjects. Astfel, putem itera in graf si obine fiecare item DataObject.

public class ReadEmployees extends SampleBase{private static final String HR_XML_RESOURCE = "hr.xml";public static final String HR_XSD_RESOURCE = "hr.xsd";public ReadEmployees(Integer commentaryLevel) {

super(commentaryLevel, SampleInfrastructure.SAMPLE_LEVEL_BASIC);}public static void main(String[] args)throws Exception{

ReadEmployees sample = new ReadEmployees(COMMENTARY_FOR_NOVICE);sample.runSample();

}public void runSample () throws Exception{

InputStream inputStream = ClassLoader.getSystemResourceAsStream(HR_XML_RESOURCE);byte[] bytes = new byte[inputStream.available()];inputStream.read(bytes);inputStream.close();HelperContext scope = createScopeForTypes();loadTypesFromXMLSchemaFile(scope, HR_XSD_RESOURCE);XMLDocument xmlDoc = getXMLDocumentFromString(scope, new String(bytes));DataObject purchaseOrder = xmlDoc.getRootObject();List itemList = purchaseOrder.getList("employee");DataObject item = null;for (int i = 0; i < itemList.size(); i++) {

item = (DataObject) itemList.get(i);System.out.println("id: " + item.get("id"));System.out.println("name: " + item.get("name"));

}}

}

Page 18: Sisteme distribuite – Tehnologiistaff.fmi.uvt.ro/~dana.petcu/distrib/TDS10-RO.pdf · dezvoltarea de retele de aplicatii orientate spre servicii, adresand probleme de afaceri reale

Exemplu - CreateEmployeesdefineste DataObjects in cod si se construiste un graf SDO.radacina DataObject este persstenta intr-un fisier si in sirul de iesire a codului urmator.

public class CreateEmployees extends SampleBase {private static final String HR_XML_RESOURCE_NEW = "hr_new.xml";public static final String HR_XSD_RESOURCE = "hr.xsd";public static final String HR_NAMESPACE =

"http://www.binildas.com/apache/tuscany/sdo/sample";public CreateEmployees(Integer commentaryLevel) {

super(commentaryLevel, SAMPLE_LEVEL_BASIC);}public static void main(String[] args) throws Exception{

CreateEmployees sample = new CreateEmployees(COMMENTARY_FOR_NOVICE);sample.runSample();

}public void runSample() throws Exception{

HelperContext scope = createScopeForTypes();loadTypesFromXMLSchemaFile(scope, HR_XSD_RESOURCE);DataFactory factory = scope.getDataFactory();DataObject purchaseOrder = factory.create(HR_NAMESPACE, "employees");

DataObject employee1 = purchaseOrder.createDataObject("employee");employee1.setString("id", "3457");employee1.set("name", "Cindy Jones");DataObject homeAddress1 = employee1.createDataObject("address");homeAddress1.set("street1", "Cindy Jones"); homeAddress1.set("city", "Stanchion");homeAddress1.set("state", "TX"); homeAddress1.set("zip-code", "79021");DataObject organization1 = employee1.createDataObject("organization");organization1.setString("id", "78");organization1.set("name", "Sales");DataObject office1 = employee1.createDataObject("office");office1.setString("id", "43");DataObject officeAddress1 = office1.createDataObject("address");officeAddress1.set("street1", "567 Murdock"); officeAddress1.set("street2", "Suite 543");officeAddress1.set("city", "Millford"); officeAddress1.set("state", "TX"); officeAddress1.set("zip-code", "79025");

DataObject employee2 = purchaseOrder.createDataObject("employee");…

Page 19: Sisteme distribuite – Tehnologiistaff.fmi.uvt.ro/~dana.petcu/distrib/TDS10-RO.pdf · dezvoltarea de retele de aplicatii orientate spre servicii, adresand probleme de afaceri reale

Service Component Architecture (SCA)

Are ca scop sa creeze valori IT noi si sa le transfome pe celeexistenre in servicii re-utilizabile mai usor. Introduce notiunea de servicii si referinte.

O componenta care implementeaza anumita logica de afaceriofera capabilitatile sale prin interfete orientate spre servicii. Componentele pot de asemenea sa consume functionalitatileoferite de alet componente prin interfete orientate spre servicii, numite referinte de servicii.

Compunerea SCA ajuta la asamblarea recursiva a componentelor cu granularitate mica parte din componentecuplate strans cu granulatie mare

Aceste componente cu granularitate mica pot fi recursivasamblate pentru a forma nivele mai inalte de componente cu granularitate mica.In SCA, un composit este un ansamblu recursiv de componentegranulate fin.

Page 20: Sisteme distribuite – Tehnologiistaff.fmi.uvt.ro/~dana.petcu/distrib/TDS10-RO.pdf · dezvoltarea de retele de aplicatii orientate spre servicii, adresand probleme de afaceri reale

Modelul de asamblare SCA

Page 21: Sisteme distribuite – Tehnologiistaff.fmi.uvt.ro/~dana.petcu/distrib/TDS10-RO.pdf · dezvoltarea de retele de aplicatii orientate spre servicii, adresand probleme de afaceri reale

Apache Tuscany SCA Java

Un sub-proiect in open-source Apache Tuscany, care a realizat o implementare Javaa SCA. Tuscany SCA este integrat cu Tomcat, Jetty, siGeronimo.SCA Java runtime este compus din nucleu siextensii.

Nucleul leaga unitati functionale impreuna si ofera SPIuricu care extensiile pot interactiona. Extensiile maresc functionalitatile SCA in timpul rulariiprecum uo descoperire de servicii, incredere, suport pentruprotocol de transport etc.

Page 22: Sisteme distribuite – Tehnologiistaff.fmi.uvt.ro/~dana.petcu/distrib/TDS10-RO.pdf · dezvoltarea de retele de aplicatii orientate spre servicii, adresand probleme de afaceri reale

Exemplu

Un singur serviciu de rezervaricu o legatura SCA implicita. BookingAgentService-Component foloseste aceastacomponenta apeleaza la alte treicomponente:

1. FlightServiceComponent,2. HotelServiceComponent, and3. CabServiceComponent

Page 23: Sisteme distribuite – Tehnologiistaff.fmi.uvt.ro/~dana.petcu/distrib/TDS10-RO.pdf · dezvoltarea de retele de aplicatii orientate spre servicii, adresand probleme de afaceri reale

ExempluComponente serviciu fin-granulate

FlightServiceComponentpublic interface IFlightService{

String bookFlight(String date, int seats, String flightClass);}public class FlightServiceImpl implements IFlightService{

public String bookFlight(String date, int seats, String flightClass){…

}}HotelServiceComponentpublic interface IHotelService{

String bookHotel(String date, int beds, String hotelClass);}public class HotelServiceImpl implements IHotelService{

public String bookHotel(String date, int beds, String hotelClass){…

}}CabServiceComponentpublic interface ICabService{

String bookCab(String date, String cabType);}public class CabServiceImpl implements ICabService{

public String bookCab(String date, String cabType){…

}

BookingAgentServiceComponentimport org.osoa.sca.annotations.Reference;public class BookingAgentServiceComponent implements

IBookingAgent{private IFlightService flightService;private IHotelService hotelService;private ICabService cabService;@Referencepublic void setFlightService(IFlightService flightService) {

this.flightService = flightService;}@Referencepublic void setHotelService(IHotelService hotelService) {

this.hotelService = hotelService;}@Referencepublic void setCabService(ICabService cabService) {

this.cabService = cabService;}public String bookTourPackage(String date, int people, String

tourPack){System.out.println("BookingAgent.bookTourPackage...");String flightBooked = flightService.bookFlight(date, people,

tourPack);String hotelBooked = hotelService.bookHotel(date, people,

tourPack);String cabBooked = cabService.bookCab(date, tourPack);if((flightBooked.equals("Success")) &&

(hotelBooked.equals("Success")) && (cabBooked.equals("Success"))){

return "Success";}else{

return "Failure";}

}}

Page 24: Sisteme distribuite – Tehnologiistaff.fmi.uvt.ro/~dana.petcu/distrib/TDS10-RO.pdf · dezvoltarea de retele de aplicatii orientate spre servicii, adresand probleme de afaceri reale

Exemplu

BookingAgentClientCreaza o instanta a SCADomainObtine o referinta la BookingAgentServiceComponent utilizand numele compenteiservviciu configurateExecuta metoda de afaceri, bookTourPackage.

import org.apache.tuscany.sca.host.embedded.SCADomain;public class BookingAgentClient{

public static void main(String[] args) throws Exception {SCADomain scaDomain = SCADomain.newInstance("BookingAgent.composite");IBookingAgent bookingAgent = scaDomain.getService(IBookingAgent.class,

"BookingAgentServiceComponent");System.out.println("BookingAgentClient.bookingTourPackage...");String result = bookingAgent.bookTourPackage("20Dec2008", 5, "Economy");System.out.println("BookingAgentClient.bookedTourPackage : " + result);scaDomain.close();

}}