Fejlett Programozsi Technikk 2 1512 1 Fejlett Programozsi
- Slides: 53
Fejlett Programozási Technikák 2. 15/12 1
Fejlett Programozási Technológiák 2. Az előző előadás tartalma: n J 2 EE ¨ JNDI ¨ RMI n Corba 2
Fejlett Programozási Technológiák 2. Forrás n Ed Roman: Mastering Enterprise Java Beans n http: //www. theserverside. com/books/wiley/mastering. EJB/downloads/Mastering. E JB 1. zip (2. 0 előtti verzióról szól !!) n 3
Fejlett Programozási Technológiák 2. A mai előadás tartalma: n Java Enterprise Edition EJB specifikáció (2. 0) ¨ EJB komponensek ¨ n n Remote, Home, Local Home interfész Session Bean Stateless ¨ Statefull ¨ n Entity Bean BMP ¨ CMP ¨ n Message Driven Bean Durable ¨ Non Durable ¨ 4
Fejlett Programozási Technológiák 2. Példa Kliens Szerver Szerver Adatbázis Címtár 5
Fejlett Programozási Technológiák 2. Megoldandó problémák n n n n n Távoli eljárás hívás Terhelés elosztás Transzparens hiba tűrés Együttműködés háttér rendszerekkel Tranzakció kezelés Klaszterezés Dinamikus telepítés Tiszta leállítás Naplózás auditálás Rendszer menedzsment Szálkezelés MOM Objektum életciklus Erőforrás gyűjtemény Biztonság Gyorstár … 6
Fejlett Programozási Technológiák 2. Megoldás n Minden cég megírja a saját szoftverét ¨ Komplex problémák ¨ Egyedi tudás ¨ Drága n Előre megírt komponenseket használ (Middle. Ware) ¨ Tesztelt, kevesebb hibával rendelkező ¨ Olcsóbb (TCO) ¨ A saját problémájával foglalkozhat 7
Fejlett Programozási Technológiák 2. Komponens architektúrák n n Explicit Middle. Ware ¨ Komplex API gyűjtemény melyet nekünk kell hívogatnunk Implicit Middle. Ware ¨ Csak az üzleti logikával kell foglalkoznunk ¨ Konfiguráció fájl -> Kérés elfogó (Request Interceptor) ¨ Megoldások: CORBA Component Model n. NET n J 2 EE - EJB n 8
Fejlett Programozási Technológiák 2. Enterprise Java Beans n EJB: ¨ Szerver oldali komponens ¨ Java interfészek halmaza ¨ Specifikáció mely leírja a komponensek és az alkalmazásszerverek együttműködését n Érvek EJB mellett ¨ Sokan támogatják ¨ Nyílt szabvány, elvileg gyártó független ¨ Gyors alkalmazás fejlesztés ¨ Platform független 9
Fejlett Programozási Technológiák 2. EJB rendszer n Bean fejlesztő ¨ n Alkalmazás szintetizáló ¨ n n Biztonsági, integrációs kérdések (LDAP, tűzfal, …) Rendszer Adminisztrátor ¨ n Ő látja át az adott problémát és tervezi meg hozzá az alkalkalmazást EJB telepítő ¨ n Telepíthető adott funkciót ellátó komponenesket gyárt Rendszer menedzsment, monitorozás, … Alkalmazás szerver gyártó Fejlesztő eszköz gyártók 10
Fejlett Programozási Technológiák 2. EJB típusok (2. 1) n Viszony Bab (Session Bean) ¨ Az üzleti folyamat modellezésére szolgál ¨ Munkafolyamat, árazás, hitel kártya engedélyező, … n Entitás Bab (Entity Bean) ¨ Az üzleti adatot modellezik ¨ Termék, egyed, rendelés, … n Üzenet vezérelt Bab (Message Driven Bean) ¨ Hasonló mint a viszony bab, csak üzenetekkel lehet kommunikálni vele 11
Fejlett Programozási Technológiák 2. Mitől EJB az EJB? javax. ejb. Enterprise. Bean interfész n Üres interfész, csak a neve a fontos n A java. io. Serializable interfészt bővíti n Az alábbi interfészek származnak belőle: n ¨ javax. ejb. Entity. Bean ¨ javax. ejb. Session. Bean ¨ javax. ejb. Message. Driven. Bean 12
Fejlett Programozási Technológiák 2. Az EJB objektum n n n Nem kapcsolódunk közvetlenül az EJB-hez Az EJB tároló elfogja a hívást és delegálja a Bab példánynak (Instance Pooling) EJB objektum ragasztóként funkcionál, Ragasztó Eszköztár A tárló generálja (tárolónként más-más lehet) Implicit Middle. Ware Kivételek (transzparent failover): ¨ ¨ Alkalmazás szintű Rendszer szintű 13
Fejlett Programozási Technológiák 2. Remote Interface Ezzel tudatjuk az EJB objektummal, hogy mely metódusokat szeretnénk távolról elérni (RMI-IIOP, Remote. Exeption) n Őse: n ¨ javax. ejb. EJBObject extends java. rmi. Remote n EJBHome get. EJBHome() n Handle get. Handle() n java. lang. Object get. Primary. Key() n boolean is. Identical(EJBObject obj) n void remove() 14
Fejlett Programozási Technológiák 2. Home Objektum A kliens tőle kéri az EJB példányt (Helyszín Transzparens) n Feladata: n ¨ EJB objektumok létrehozása ¨ Meglévő EJB objektumok megtalálása ¨ EJB objektumok eltávolítása Tároló specifikus n Automatikusan generált n 15
Fejlett Programozási Technológiák 2. Home Interfész n n Tudja hogyan kell az EJB objektumot inicializálni javax. ejb. EJBHome ¨ get. EJBMeta. Data ¨ get. Home. Handle ¨ remove 16
Fejlett Programozási Technológiák 2. Local Interfész n A Home interfész használata lassú ¨ ¨ ¨ n Helyette: ¨ ¨ ¨ n A kliens meghívja a lokális objektumot A lokális objektum elvégzi a megfelelő Middle. Ware műveleteket A Lokális objektum meghívja a Bab példányt javax. ejb. EJBLocal. Object ¨ ¨ n Kliens a helyi csonkhoz fordul A helyi csonk átalakítja a paramétereket hálózaton hasznáhatóvá A váz Visszaalakítja őket A váz meghívja az EJB objektumot Az EJB végrehajtja a szükséges Middle. Ware műveleteke Az EJB objektum meghívja Bab példányt és így vissza EJBLocal. Home get. EJBLocal. Home() java. lang. Object get. Primary. Key() boolean is. Identical(EJBLocal. Object obj) void remove() Problémák: ¨ ¨ Nincs távoli objektum hozzáférés (csak azonos processzen belül) A paraméterek referencia szerint adódnak át (később problémás lehet átalakítani) 17
Fejlett Programozási Technológiák 2. Telepítés leírók n n n Forrás kódok nélkül is hangolható a rendszer XML fájlok Ezekben specifikálhatjuk azokat a szolgáltatásokat melyekre szükségünk van a Tároló részéről ¨ Bab menedzsment ¨ Tranzakció ¨ Biztonság ¨… 18
Fejlett Programozási Technológiák 2. Ejb-jar fájlok Ezekben a fájlokban fogjuk össze komponensünket n Elemei: n ¨ EJB class fájlok ¨ Home interfész ¨ Local interfész ¨ Remote interfész ¨ Local Home interfész ¨ Telepítés leíró ¨ Gyártó specifikus konfig. fájlok 19
Fejlett Programozási Technológiák 2. Egy minta viszony EJB Session Bean n Remote Interface n Home Interface n Local. Home Interface n 20
Fejlett Programozási Technológiák 2. Viszony Bab import javax. ejb. Session. Context; public class Hello. Bean implements javax. ejb. Session. Bean { public void ejb. Create() { System. out. println("ejb. Create()"); } public void ejb. Remove() { System. out. println("ejb. Remove()"); } public void ejb. Activate() { System. out. println("ejb. Activate()"); } public void ejb. Passivate() { System. out. println("ejb. Passivate()"); } public void set. Session. Context(Session. Context ctx) { System. out. println("set. Session. Context()"); } public String hello() { System. out. println("hello()"); return "Hello, World!"; } } 21
Fejlett Programozási Technológiák 2. Távoli Interfész, Lokális Interfész public interface Hello extends javax. ejb. EJBObject { public String hello() throws java. rmi. Remote. Exception; } public interface Hello. Local extends javax. ejb. EJBLocal. Object { public String hello(); } 22
Fejlett Programozási Technológiák 2. Home, Local. Home interfész public interface Hello. Home extends javax. ejb. EJBHome { Hello create() throws java. rmi. Remote. Exception, javax. ejb. Create. Exception; } public interface Hello. Local. Home extends javax. ejb. EJBLocal. Home { Hello. Local create() throws javax. ejb. Create. Exception; } 23
Fejlett Programozási Technológiák 2. Telepítés leíró !DOCTYPE ejb-jar PUBLIC "-//Sun Microsystems, Inc. //DTD Enterprise Java. Beans 2. 0//EN" "http: //java. sun. com/dtd/ejb-jar_2_0. dtd"> <ejb-jar> <enterprise-beans> <session> <ejb-name>Hello</ejb-name> <home>Hello. Home</home> <remote>Hello</remote> <local-home>Hello. Local. Home</local-home> <local>Hello. Local</local> <ejb-class>Hello. Bean</ejb-class> <session-type>Stateless</session-type> <transaction-type>Container</transaction-type> </session> </enterprise-beans> </ejb-jar> 24
Fejlett Programozási Technológiák 2. Kliens public class Hello. Client { public static void main(String[] args) throws Exception { Properties props = System. get. Properties(); Context ctx = new Initial. Context(props); Object obj = ctx. lookup("Hello. Home"); Hello. Home home = (Hello. Home) javax. rmi. Portable. Remote. Object. narrow(obj, Hello. Home. class); Hello hello = home. create(); System. out. println(hello()); hello. remove(); } } 25
Fejlett Programozási Technológiák 2. Teljes működés 26
Fejlett Programozási Technológiák 2. Viszony bab (Session Bean) n n Üzleti folyamatot valósít meg Nem mentődnek el a tartós tároló helyre: ¨ Rövid életűek (a kliens kód hívása alatt élnek) ¨ Általában nem élik túl a szerver leállásokat n Két típusa van: ¨ Állapot n n n mentes (Stateless) Egy metódus hívásig él Nem őrzi meg állapotát Minden egyede egyenlő, újrahasznosítható, készletezhető ¨ Állapottal n n n rendelkező (Statefull) Több egymást követő kérést tranzakciót képes kiszolgálni Megőrzi az állapotát (a viszony idejére) Készletezés: passivation, activation (erőforrások menedzselése)27
Fejlett Programozási Technológiák 2. Egyed bab (Entity bean) n n Egy állandó adat memóriabeli Java reprezentációja Tudja, hogyan kell elmentenie és kiolvasnia magát A memóriabeli példányát módosítva módosul a tartós adat is (ejb. Load(), ejb. Store() a szinkronizáció a tároló feladata) Lehetséges megoldások: ¨ ¨ ¨ n n Csak egy szál férhet hozzá egy időben -> több EJB ugyanaz az adat -> tranzakciók Gyűjteményezhető (Pooling) ¨ ¨ n Serialization Objet-Relational Mapping Objektum adatbázisok ejb. Activate(), ejb. Passivate() ejb. Store(), ejb. Load() Adatbázis kód: ¨ ¨ Bean Managed Persistence Entity Bean – BMP Container Managed Persistence Entity Bean - CMP 28
Fejlett Programozási Technológiák 2. Egyed bab n Létrehozása, törlése (adatbázissal együtt!): ¨ ejb. Create() ¨ ejb. Remove() n Elsődleges kulcsot megvalósító osztály ¨ Az egyed babok kereshetőek ¨ Finder metódusok (home interfész) n Az adatbázis módosításával módosul az egyed bab is (új is létrejön)! 29
Fejlett Programozási Technológiák 2. Egyed bab környezet n Javax. ejb. Entity. Context extends EJBContext ¨ get. EJBLocal. Object(), get. EJBObject() – (this) ¨ get. Primary. Key() – connection pooling ejb. Load n ejb. Remove n 30
Fejlett Programozási Technológiák 2. BMP n n Nekünk kell kézzel kódolnunk az adatbázis hozzárendelést javax. ejb. Entity. Bean set. Entity. Context ¨ ejb. Find<. . >– csak itt kell implementálni pl. : select id from x where w > 0, ¨ n n ¨ ¨ ¨ ¨ Primary. Key ejb. Find. The. Biggest, … kötelező ejb. Find. By. Primary. Key ezeket meg kell adni a Local, vagy home interfészben EJBObject find<…> ejb. Home<. . > – globális műveletek (sorok megszámolása) ejb. Create – INSERT INTO … ejb. Activate – socket, …. Nyitás ejb. Load – get. Primary. Key, Select … ejb. Store – UPDATE ejb. Passivate – socket, … zárás ejb. Remove – get. Primary. Key, delete 31
Fejlett Programozási Technológiák 2. Példa Remote interface n Home interface n PK n Bean n n Deployment Descriptor 32
Fejlett Programozási Technológiák 2. Távoli interfész public interface Account extends EJBObject { public void deposit(double amt) throws Account. Exception, Remote. Exception; public void withdraw(double amt) throws Account. Exception, Remote. Exception; public double get. Balance() throws Remote. Exception; public String get. Owner. Name() throws Remote. Exception; public void set. Owner. Name(String name) throws Remote. Exception; public String get. Account. ID() throws Remote. Exception; public void set. Account. ID(String id) throws Remote. Exception; } 33
Fejlett Programozási Technológiák 2. Helyi interfész public interface Account. Home extends EJBHome { Account create(String account. ID, String owner. Name) throws Create. Exception, Remote. Exception; public Account find. By. Primary. Key(Account. PK key) throws Finder. Exception, Remote. Exception; public Collection find. By. Owner. Name(String name) throws Finder. Exception, Remote. Exception; public double get. Total. Bank. Value() throws Account. Exception, Remote. Exception; } 34
Fejlett Programozási Technológiák 2. Elsődleges Kulcs public class Account. PK implements java. io. Serializable { public String account. ID; public Account. PK(String id) { this. account. ID = id; } public Account. PK() { } public String to. String() { return account. ID; } public int hash. Code() { return account. ID. hash. Code(); } public boolean equals(Object account) { return ((Account. PK)account). account. ID. equals(account. ID); } } 35
Fejlett Programozási Technológiák 2. Bean public class Account. Bean implements Entity. Bean { protected Entity. Context ctx; private String account. ID; // PK private String owner. Name; private double balance; public double get. Balance() { System. out. println("get. Balance() called. "); return balance; } public void set. Owner. Name(String name) { System. out. println("set. Owner. Name() called. "); owner. Name = name; } … 36
Fejlett Programozási Technológiák 2. Bean: ejb. Find… public Collection ejb. Find. By. Owner. Name(String name) throws Finder. Exception { Prepared. Statement pstmt = null; Connection conn = null; Vector v = new Vector(); try { System. out. println("ejb. Find. By. Owner. Name(" + name + ") called"); conn = get. Connection(); pstmt = conn. prepare. Statement("select id from accounts where owner. Name = ? "); pstmt. set. String(1, name); Result. Set rs = pstmt. execute. Query(); while (rs. next()) { String id = rs. get. String("id"); v. add. Element(new Account. PK(id)); } return v; } catch (Exception e) { throw new Finder. Exception(e. to. String()); } finally { try { if (pstmt != null) pstmt. close(); } catch (Exception e) {} try { if (conn != null) conn. close(); }catch (Exception e) {} } } 37
Fejlett Programozási Technológiák 2. Bean: Remove public void ejb. Remove() throws Remove. Exception { Account. PK pk = (Account. PK) ctx. get. Primary. Key(); String id = pk. account. ID; Prepared. Statement pstmt = null; Connection conn = null; try { conn = get. Connection(); pstmt = conn. prepare. Statement("delete from accounts where id = ? "); pstmt. set. String(1, id); if (pstmt. execute. Update() == 0) { throw new Remove. Exception("Account " + pk + " failed to be removed from the database"); } } catch (Exception ex) {throw new EJBException(ex. to. String()); } finally { try { if (pstmt != null) pstmt. close(); } catch (Exception e) {} try { if (conn != null) conn. close(); }catch (Exception e) {} } } 38
Fejlett Programozási Technológiák 2. Telepítés leíró/1 <ejb-jar> <enterprise-beans> <entity> <ejb-name>Account</ejb-name> <home>examples. Account. Home</home> <remote>examples. Account</remote> <local-home>examples. Account. Local. Home</local-home> <local>examples. Account. Local</local> <ejb-class>examples. Account. Bean</ejb-class> <persistence-type>Bean</persistence-type> <prim-key-class>examples. Account. PK</prim-key-class> <reentrant>False</reentrant> <resource-ref> <res-ref-name>jdbc/ejb. Pool</res-ref-name> <res-type>javax. sql. Data. Source</res-type> <res-auth>Container</res-auth> </resource-ref> </entity> </enterprise-beans> 39
Fejlett Programozási Technológiák 2. Telepítés leíró /2 <assembly-descriptor> <container-transaction> <method> <ejb-name>Account</ejb-name> <method-intf>Local</method-intf> <method-name>*</method-name> </method> <ejb-name>Account</ejb-name> <method-intf>Remote</method-intf> <method-name>*</method-name> </method> <trans-attribute>Required</trans-attribute> </container-transaction> </assembly-descriptor> </ejb-jar> 40
Fejlett Programozási Technológiák 2. CMP n n A bab fejlesztő nem tudja milyen adtabázist fognak használni A forráskódot nem szeretné kiadni Szeparált adatbázis kezelés/ üzleti logika A tároló fogja legenerálni a szükséges kódot a mi osztályunkból származtatva ¨A mezők az alosztályban vannak definiálva (ez tároló függő) ¨ A get/set metódusok az alosztályban vannak definiálva ¨ Az ősosztályt mint absztrakt osztályt kell definiálni! ¨ A megfelelő absztrakt get/set metódusokkal ¨ A telepítés leíróból veszi a szükséges információkat (Abstract Persistence Schema) ¨ Saját lekérdező nyelv EJB-QL (SELECT OBJECT(a) FROM Accoun As a) 41
Fejlett Programozási Technológiák 2. CMP metódusok n ejb. Select<. . > – ezzel is kitehetjük az SQL-t a leíróba (ejb. Select. All. Account. Balances) ¨ Csak a babon belül hívható ¨ Absztrakt metódus n ejb. Home<. . > ezen belül használjuk az ejb. Select-et 42
Fejlett Programozási Technológiák 2. Példa Bab n Telepítő n 43
Fejlett Programozási Technológiák 2. Bab public abstract class Product. Bean implements Entity. Bean { protected Entity. Context ctx; public Product. Bean() { } public abstract String get. Name(); public abstract void set. Name(String name); public abstract String get. Description(); public String ejb. Create(String product. ID, String name, String description, double base. Price) { System. out. println("ejb. Create() called"); set. Product. ID(product. ID); set. Name(name); set. Description(description); set. Base. Price(base. Price); return product. ID; } 44
Fejlett Programozási Technológiák 2. Telepítés leíró <ejb-name>Product</ejb-name> <home>examples. Product. Home</home> <remote>examples. Product</remote> <ejb-class>examples. Product. Bean</ejb-class> <persistence-type>Container</persistence-type> <prim-key-class>java. lang. String</prim-key-class> <reentrant>False</reentrant> <cmp-version>2. x</cmp-version> <abstract-schema-name>Product. Bean</abstract-schema-name> <cmp-field> <field-name>name</field-name> </cmp-field> <primkey-field>product. ID</primkey-field> <query-method> <method-name>find. By. Name</method-name> <method-params> <method-param>java. lang. String</method-param> </method-params> </query-method> <ejb-ql> <![CDATA[Select OBJECT(a) FROM Product. BEan AS a WHERE name = ? 1]]> </ejb-ql> </query> </entity> 45
Fejlett Programozási Technológiák 2. BMP, CMP életciklus 46
Fejlett Programozási Technológiák 2. Üzenet vezérelt bab (Message driven bean) Az előző komponensek RMI-IIOP-ot használtak kommunikációra n Hátrányai: n ¨A kliensnek várnia kell a válaszra (nem engedélyezetett a szál kezelés !!) ¨ Nem megbízható ¨ Egyszerre csak egyeddel kommunikál n Message Oriented Middle. Ware ¨ MSMQ, IBM MQSeries, … cég függő ¨ JMS szabványos igyekszik lenni (API/SPI) 47
Fejlett Programozási Technológiák 2. JMS API n Messaging Domains: ¨ Publish/subscribe ¨ Point-to-Point 48
Fejlett Programozási Technológiák 2. Üzenet vezérelt bab n Teljesen el van különítve a többi komponenstől ¨ n Egy üzleti metódusuk van ¨ n n Nincs home, remote, localhome interfész on. Message() menet közben deríti ki mit is kapott (instanceof) Nincs visszatérési értékük Nem tudnak kivételt küldeni a küldőnek Állapotmentesek Tartós vagy nem tartós listatagok Tartós – minden üzenetet megkap akkor is ha nem aktív ¨ Nem tartós csak azokat kapja meg amikor aktív volt ¨ n javax. jms. Message. Listener ¨ n on. Message() javax. ejb. Message. Driven. Bean ejb. Remove ¨ set. Message. Driven. Context ¨ 49
Fejlett Programozási Technológiák 2. Példa: Bean public class Log. Bean implements Message. Driven. Bean, Message. Listener { protected Message. Driven. Context ctx; public void set. Message. Driven. Context(Message. Driven. Context ctx) { this. ctx = ctx; } public void ejb. Create() { System. err. println("ejb. Create()"); } public void on. Message(Message msg) { Text. Message tm = (Text. Message) msg; try { String text = tm. get. Text(); System. err. println("Received new message : " + text); } catch(JMSException e) { e. print. Stack. Trace(); } } public void ejb. Remove() { System. err. println("ejb. Remove()"); } } 50
Fejlett Programozási Technológiák 2. Telepítés leíró <ejb-jar> <enterprise-beans> <message-driven> <ejb-name>Log</ejb-name> <ejb-class>examples. Log. Bean</ejb-class> <transaction-type>Container</transaction-type> <message-driven-destination> <destination-type>javax. jms. Topic</destination-type> </message-driven-destination> </message-driven> </enterprise-beans> 51 </ejb-jar>
Fejlett Programozási Technológiák 2. Összefoglaló Remote, Home, Local Home interfész n Session Bean n ¨ Stateless ¨ Statefull n Entity Bean ¨ BMP ¨ CMP n Message Driven Bean ¨ Durable ¨ Non Durable 52
Fejlett Programozási Technológiák 2. A következő előadás tartalma n . NET architektúra ¨ IL n C# 53