Programrendszerek Fejlesztése

Slides:



Advertisements
Hasonló előadás
4. alkalom – Hálózat Kezelés
Advertisements

Osztály leszármaztatás

Felhasználói felületek és üzleti logika Bollobás Dávid ASP.NET
MATEMATIKA Év eleji felmérés 3. évfolyam
Programozás III KOLLEKCIÓK 2..
Utófeszített vasbeton lemez statikai számítása Részletes számítás
Öröklődés 2..
RMI = Remote Method Invocation
© Kozsik Tamás Tömbök, kollekciók és egyéb alaposztályok.
© Kozsik Tamás Beágyazott osztályok A blokkstrukturáltság támogatása –Eddig: egymásba ágyazható blokk utasítások Osztálydefiníciók is egymásba.
A tételek eljuttatása az iskolákba
Bevezetés a Java programozásba
Fájlkezelés, IO Kivételkezelés Belső osztályok
Abstract osztályok és interface-ek Beolvasás és kiíratás 7. gyakorlat.
1 Fejlett Programozási Technikák 2. 15/11. Fejlett Programozási Technológiák 2. 2 A mai előadás tartalma Probléma a Java Servlet-tel Template eszközök.
Fejlett Programozási Technikák 2.
Fejlett Programozási Technológiák II. Világos Zsolt 7. gyakorlat.
9. Háttér logika Dr. Bilicki Vilmos Szegedi Tudományegyetem
Tömbök ismétlés Osztályok Java-ban Garbage collection
VÁLOGATÁS ISKOLÁNK ÉLETÉBŐL KÉPEKBEN.
1. IS2PRI2 02/96 B.Könyv SIKER A KÖNYVELÉSHEZ. 2. IS2PRI2 02/96 Mi a B.Könyv KönyvelésMérlegEredményAdóAnalitikaForintDevizaKönyvelésMérlegEredményAdóAnalitikaForintDeviza.
A Java programozási nyelvSoós Sándor 1/17 Java programozási nyelv 4. rész – Osztályok II. Nyugat-Magyarországi Egyetem Faipari Mérnöki Kar Informatikai.
Osztott alkalmazások kezelése. VIR elosztott architektúra indítékai: - meglévő komponensek integrációja - WEB / Internet elterjedése (nemzetköziség) -
WSDL alapismeretek A WSDL (Web Services Description Language – Web szolgáltatások leíró nyelv) egy XML-alapú nyelv a Web szolgáltatások leírására és azok.
Hálózatkezelés, java.net Elek Tibor
JSP és JavaBean JavaServer Pages és Java Beans Fabók Zsolt Általános Informatikai Tanszék Miskolci Egyetem.
C# tagfüggvények.
SPRING FRAMEWORK bemutatása
Sárgarépa piaca hasonlóságelemzéssel Gazdaság- és Társadalomtudományi kar Gazdasági és vidékfejlesztési agrármérnök I. évfolyam Fekete AlexanderKozma Richárd.
WEB MES (webes gyártásirányító rendszer)
DRAGON BALL GT dbzgtlink féle változat! Illesztett, ráégetett, sárga felirattal! Japan és Angol Navigáláshoz használd a bal oldali léptető elemeket ! Verzio.
PHP I. Alapok. Mi a PHP? PHP Hypertext Preprocessor Szkriptnyelv –Egyszerű, gyors fejlesztés –Nincs fordítás (csak értelmező) Alkalmazási lehetőségek:
P ROGRAMOZÁS C# - BAN Kivételkezelés. P ÉLDA I. Nullával való osztás miatt kapjuk a hibaüzenetet.
Perzisztencia-megoldások Java Technológiával Molnár István, Simon Géza.
szakmérnök hallgatók számára
Java 2 Enterprise Edition
Publikációs portál Initial J2EE architecture UML bázisú modellezés és analízis Csapat: UML7 (Percze Dániel, Rajnai Zoltán, Ráth István, Tóth Dániel, Vágó.
Logikai szita Izsó Tímea 9.B.
Szoftvertechnológia alapjai Java előadások Förhécz András, doktorandusz tárgy honlap:
Szoftvertechnológia alapjai Java előadások Förhécz András, doktorandusz tárgy honlap:
1 Szoftvertechnológia alapjai Java előadások Förhécz András, doktorandusz tárgy honlap:
1 Hernyák Zoltán Programozási Nyelvek II. Eszterházy Károly Főiskola Számítástudományi tsz.
1 Hernyák Zoltán Web: Magasszintű Programozási Nyelvek I. Eszterházy.
1 Hernyák Zoltán Web: Magasszintű Programozási Nyelvek I. Eszterházy.
Javascript Microsoft által készített kiegészítése Statikus típusosság Nagy projektek Windows 8 fejlesztésénél WinRT egy részét ebben írták Nyílt forráskódú,
A klinikai transzfúziós tevékenység Ápolás szakmai ellenőrzése
Komoróczy Tamás 1 Java programozási nyelv A nyelv alapjai.
Java programozási nyelv Adatbekérés konzolról
Java web programozás 11..
Enterpise JavaBeans Simon Balázs
1. Melyik jármű haladhat tovább elsőként az ábrán látható forgalmi helyzetben? a) A "V" jelű villamos. b) Az "M" jelű munkagép. c) Az "R" jelű rendőrségi.
Webprogramozó tanfolyam
A Visual Basic nyelvi elemei
> aspnet_regiis -i 8 9 TIPP: Az „Alap” telepítés gyors, nem kérdez, de később korlátozhat.
A KÖVETKEZŐKBEN SZÁMOZOTT KÉRDÉSEKET VAGY KÉPEKET LÁT SZÁMOZOTT KÉPLETEKKEL. ÍRJA A SZÁMOZOTT KÉRDÉSRE ADOTT VÁLASZT, VAGY A SZÁMOZOTT KÉPLET NEVÉT A VÁLASZÍV.
Webes MES keretrendszer fejlesztése Kiss Miklós Dániel G-5S8 Tervezésvezető: Dr. Hornyák Olivér.
Java web programozás 5..
Java web programozás 6..
1Szegedi Tudományegyetem Természettudományi és Informatikai KarAntal Gábor Programozás I. 6. gyakorlat.
TÁMOP /1-2F JAVA programozási nyelv NetBeans fejlesztőkörnyezetben I/13. évfolyam Osztályok, objektumok definiálása és alkalmazása. Saját.
Programozás III JPA.
Krizsán Zoltán, iit C# osztályok 2 Adattagok  Osztály hatáskörben definiált változó.  Formája: [attribútum] [módosító] típus azonosító [=kezdő érték][,
EJB üzenet vezérelt bean (MDB)
Hibernate / EclipseLink / OpenJPA összehasonlítás
Hernyák Zoltán Magasszintű Programozási Nyelvek I.
Hálózatkezelés Java-ban
JAVA programozási nyelv NetBeans fejlesztőkörnyezetben I/13. évfolyam
JBoss Wildfly Kalla Mór
JAVA programozási nyelv NetBeans fejlesztőkörnyezetben I/13. évfolyam
Előadás másolata:

Programrendszerek Fejlesztése 7/4

A mai előadás tartalma: Alkalmazás keretrendszerek JEE Erőforráskezelés JNDI Tranzakciókezelés Tároló által menedzselt tranzakciók Bab által menedzselt tranzakciók EJB RMI JPA

Vállalati szoftver 10 ügyvéd 11 féle válasz Több mint egy weboldal 2 vagy több rétegű architektúra Komponens alapú elosztott rendszerek Együttműködés más rendszerekkel Karbantartható kód/alkalmazás

Példa Kliens Kliens Kliens Kliens Szerver Szerver Szerver Szerver Címtár Adatbázis Adatbázis

Megoldandó problémák 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 …

Megoldás Minden cég megírja a saját szoftverét Komplex problémák Egyedi tudás Drága Előre megírt komponenseket használ (MiddleWare) Tesztelt, kevesebb hibával rendelkező Olcsóbb (TCO) A saját problémájával foglalkozhat

Komponens architektúrák Explicit MiddleWare Komplex API gyűjtemény melyet nekünk kell hívogatnunk Implicit MiddleWare Csak az üzleti logikával kell foglalkoznunk Konfiguráció fájl -> Kérés elfogó (Request Interceptor) Megoldások: CORBA Component Model .NET J2EE - EJB

Alkalmazás rétegelés Az alkalmazás kompnensek feladatának elválasztása Megjelenítés réteg A kérés/válasz objektuomkra koncentrál Megoldja a modell alapján a GUI renderelést Formázási és nem üzleti logika alapú validálási logikát tartalmaz A más rétegek által dobott kivételeket kezeli Perzisztencia réteg A tárolókkal kommunikál Lekérdezés nyelvet biztosít ORM képesség JDBC, Hibernate, iBATIS, JDO, Entity Beans, … Domén réteg Az üzleti objektumokat tárolja, ezek a többi rétegben is felhasználhatóak Kezeli az üzleti objektumok közötti komplex relációat Gazdag üzleti logika ORM A domén objektumok csak egymástól függhetnek

Szolgáltatás réteg? Hogyan pozicionáljuk a lazán csatolt üzleti logikát? Mi a szolgáltatás logika? Hogyan kell a konténer szintű szolgáltatásokat megvalósítani? Hogyan kezeljük a POJO alapú alkalmazásokban a tranzakciókat? Hogyan kommunikáljunk a megjelenítési rétegből a perzisztencia rétegbe? Hogyan kapunk üzleti logikát megvalósító szolgáltatásokat? Hogyan kommunikálnak az üzleti objektumok a perzisztencia téteggel? Hogyan adjuk át a prezisztencia rétegben található objektumokat a UI rétegnek?

Alkalmazás rétegek Szolgáltatás réteg Egy átjáró amely segítségével az üzleti logikát biztosítjuk a külvilág számára Kezeli a tároló szintű szolgáltatásokat (tranzakciók, biztonság, …) Sok alkalmazásban nincs megfelelően definiálva

Alkalmazás keretrendszerek JEE Spring OSGI SCA/SDO …

Java 2 Enterprise Edition J2EE tartalmazza a J2SE-t API, szabvány, tervezési minta gyűjtemény Elemei (rétegek szerint): Prezentáció Adat tárolás kinyerés Kommunikáció

API gyűjtemény JSP RMI JDBC Servlet CORBA JNDI JavaMail JMS EJB JSF … JAX SAX DOM JTA JAAS …

Megvalósítások Tomcat JBoss WebSphere iPlanet J2EE SDK … http://www.javaskyline.com/serv.html

EJB rendszer Bean fejlesztő Alkalmazás szintetizáló EJB telepítő Telepíthető adott funkciót ellátó komponenesket gyárt Alkalmazás szintetizáló Ő látja át az adott problémát és tervezi meg hozzá az alkalkalmazást EJB telepítő Biztonsági, integrációs kérdések (LDAP, tűzfal, …) Rendszer Adminisztrátor Rendszer menedzsment, monitorozás, … Alkalmazás szerver gyártó Fejlesztő eszköz gyártók

Erőforrás hozzáférés A JEE komponensek sok fajta erőforráshoz férhetnek hozzá (email, LDAP, fájl, …) A JNDI feladata a név szolgáltatás biztosítása a komponensek számára

JNDI Java Naming and Directory Interface A J2EE legfontosabb összetevője (a J2SEE –nek is része) Feladata: Objektumok referenciáinak tárolása kereshető formában Együttműködés a címtár alapú rendszerekkel (amelyek tudják az információt hierarchikusan kezelni) Felépítése: JNDI API Elnevezés menedzser JDNI SPI Szolgáltatók (Service Provider) LDAP COS RMI DNS NIS Fájl Rendszer Windows Reg. Novell Fájl R.

Elnevezés, Címtár Elnevezés (Naming): Címtár (directory): LDAP, DNS, COS, … Kötés – binding Referenciák, Címek Konteksztus (Context) (név-objektum kötés halmaz) Névterek, Elnevezési rendszerek – konteksztusok halmaza Címtár (directory): Az objektumok rendelkeznek tulajdonságokkal is Tulajdonság azonosító Címtár szolgáltatás Directory Schema Keresések, …

JNDI csomagok javax.naming javax.naming.directory javax.naming.event Kontesztus (Context) Kezdő kontesztkus (Initial Context) list, lisBindings, bind, reBind, unBind Al kontesztus - subContext Nevek (Name , CompositeName ) String, Name Kötések Referenciák javax.naming.directory Attribútumok lekérdezése DirContext, getAttributes(), modifyAttributes(), search() javax.naming.event javax.naming.ldap (Teljesebb LDAP) LDAP v3 LdapContext javax.naming.spi

Használata (fájl rendszer) import javax.naming.Context; import javax.naming.InitialContext; import javax.naming.NamingException; import java.util.Hashtable; class Lookup { public static void main(String[] args) { if (args.length != 1) { System.err.println("usage: java Lookup <filename>"); System.exit(-1);} String name = args[0]; Hashtable env = new Hashtable(11); env.put(Context.INITIAL_CONTEXT_FACTORY,"com.sun.jndi.fscontext.RefFSContextFactory"); try { Context ctx = new InitialContext(env); Object obj = ctx.lookup(name); System.out.println(name + " is bound to: " + obj); NamingEnumeration list = ctx.list("awt"); while (list.hasMore()) { NameClassPair nc = (NameClassPair)list.next(); System.out.println(nc);} ctx.close(); } catch (NamingException e) { System.err.println("Problem looking up " + name + ": " + e); } }}

Kötés, Konteksztus Kötés: bind, rebind, unbind, rename Al kontesztus: Fruit fruit = new Fruit("orange"); ctx.bind("favorite", fruit); Fruit fruit = new Fruit("lemon"); ctx.rebind("favorite", fruit); ctx.unbind("favorite"); ctx.rename("report.txt", "old_report.txt"); Al kontesztus: createSubcontext, destroySubcontext ctx.createSubcontext("new"); ctx.destroySubcontext("new");

Használata címtár esetén import javax.naming.Context; import javax.naming.directory.InitialDirContext; import javax.naming.directory.DirContext; import javax.naming.directory.Attributes; import javax.naming.NamingException; import java.util.Hashtable; class Getattr { public static void main(String[] args) { Hashtable env = new Hashtable(11); env.put(Context.INITIAL_CONTEXT_FACTORY,"com.sun.jndi.ldap.LdapCtxFactory"); env.put(Context.PROVIDER_URL, "ldap://localhost:389/o=JNDITutorial"); env.put(Context.SECURITY_PRINCIPAL, "joeuser"); env.put(Context.SECURITY_CREDENTIALS, "joepassword"); try { DirContext ctx = new InitialDirContext(env); Attributes attrs = ctx.getAttributes("cn=Ted Geisel, ou=People"); System.out.println("sn: " + attrs.get("sn").get()); ctx.close(); } catch (NamingException e) { System.err.println("Problem getting attribute: " + e); }

Attribútum, Attribútum hierarchia: Módosítás: Név – vezetéknév Attributes answer = ctx.getAttributes("cn=Ted Geisel, ou=People"); for (NamingEnumeration ae = answer.getAll(); ae.hasMore();) { Attribute attr = (Attribute)ae.next(); System.out.println("attribute: " + attr.getID()); /* Print each value */ for (NamingEnumeration e = attr.getAll(); e.hasMore(); System.out.println("value: " + e.next())) ; } Módosítás: ModificationItem[] mods = new ModificationItem[3]; mods[0] = new ModificationItem(DirContext.REPLACE_ATTRIBUTE, new BasicAttribute("mail", "geisel@wizards.com")); mods[1] = new ModificationItem(DirContext.ADD_ATTRIBUTE, new BasicAttribute("telephonenumber", "+1 555 555 5555")); mods[2] = new ModificationItem(DirContext.REMOVE_ATTRIBUTE, new BasicAttribute("jpegphoto"));

Keresés, Kötés Search Search control, Search filter Binding Attributes matchAttrs = new BasicAttributes(true); // ignore attribute name case matchAttrs.put(new BasicAttribute("sn", "Geisel")); matchAttrs.put(new BasicAttribute("mail")); NamingEnumeration answer = ctx.search("ou=People", matchAttrs); String[] attrIDs = {"sn", "telephonenumber", "golfhandicap", "mail"}; NamingEnumeration answer = ctx.search("ou=People", matchAttrs, attrIDs); Search control, Search filter SearchControls ctls = new SearchControls(); ctls.setReturningAttributes(attrIDs); ctls.setSearchScope(SearchControls.SUBTREE_SCOPE); ctls.setCountLimit(1); ctls.setTimeLimit(1000); String filter = "(&(sn=Geisel)(mail=*))"; NamingEnumeration answer = ctx.search("ou=People", filter, ctls); Binding Attributes attrs = new BasicAttributes(true); // case-ignore Attribute objclass = new BasicAttribute("objectclass"); objclass.add("top"); objclass.add("organizationalUnit");attrs.put(objclass); Context result = ctx.createSubcontext("ou=Fruits", attrs);

Erőforrás injektálás A konténer automatikusan beinyektálja a megfelelően annotált mezőbe/tulajdonságba Inicializáláskor (mező/tulajdonság) Futás időben (osztály alapú) @Resource Név (name) Típus (type) Azonosítás típusa (authenticationType) Megosztható (shareable) Csatolás neve (mappedName) Leírás (dessc)

Elosztott rendszerek Gyakran kliens-szerver Problémák: A távoli objektum megtalálása Bájt kód betöltése Kommunikáció Socket használat RPC használat RMI Corba RMI IIOP SOAP XML RPC

RMI Remote Method Invocation Objektum orientált RPC Java specifikus Teljes objektumokat tudunk átküldeni, nem csak előre definiált típusokat Java specifikus Elosztott szemétgyűjtő Biztonságos Egyszerű (nincs IDL) URl szerű: rmi://host:port/objektumnév

Különbségek Elosztott vs. Normál Java alkalmazás Távoli objektum hivatkozása használható A Cast ugyanúgy működik instanceOf is A távoli objektumoknál az interfésszel kommunikálunk nem a megvalósító osztállyal A távoli eljárás hívások eredménye és paraméterei érték szerint adódnak át A távoli objektum hivatkozásként adódik át Külön hibakezelés kell

Felépítése Java.RMI.remote interfész RemoteException RemoteObject Ezt kell bővítenünk Minden metódusnál specifikálni kell a java.rmi.RemoteException kivételt A távoli eljárás deklarálásánál a benne szerepelő objektumokat interfészekkel kell megadnunk RemoteException Kommunikációs hiba Paraméter átalakítás hiba Protokol hiba RemoteObject java.lang.Object java.rmi.server.UnicastRemoteObject java.rmi.activation.Activatable

Működése Hagyományos RPC megoldás: Csonkok (stubs) elrejtik a hálózati protokollokat és a serializációt Kliens oldali reprezentáció vagy proxy Ugyanazt az interfészt valósítja meg mint a távoli osztály Egy csonk metódus hívás: Kapcsolatot kezdeményez a távoli JVM-mel Átalakítja és átviszi a paramétereket (marshalls) Megvárja az eredményt !!!!!! Kiolvassa és visszaalakítja a paramétereket (unmarshalls) Visszaadja az eredményt a hívónak Vázak (skeletons) a szerver oldali ragasztó (Java2 ben nem kötelező) Szerver oldali reprezentáció: Kiolvassa a paramétereket és visszaalakítja őket (unmarshals) Meghívja a megfelelő objektum megfelelő metódusát Átalakítja és átküldi az eredményt (marshals)

Használata Távoli interfész deklarálás Osztály megvalósítás public interface WeatherService extends Remote { public List getWeatherInformation() throws RemoteException;} Osztály megvalósítás public class WeatherServiceImpl extends UnicastRemoteObject implements WeatherService { public WeatherServiceImpl() throws RemoteException { super();updateWeatherConditions();} public List getWeatherInformation(){} public static void main( String args[] ) throws Exception {WeatherService service = new WeatherServiceImpl(); String serverObjectName = "rmi://localhost/WeatherService"; Naming.rebind( serverObjectName, service );} Kliens megvalósítás String remoteName = "rmi://" + server + "/WeatherService"; WeatherService weatherService =( WeatherService ) Naming.lookup( remoteName ); List weatherInformation = weatherService.getWeatherInformation(); Fordítás Javac Rmic -> csonk osztályok (rmic –v1.2 -> vázat is gyárt) Futtatás rmiregistry Java Server Java Kliens

Paraméter átadás Serializable (menthető) objektumok (java.io.Serializable) Távoli objektumok (nem exportált) Érték szerint adódik át (serialization) Távoli objektumok (exportált) Referencia szerint adódik át (csonk) Referencia integritás Osztály kommentár (Annotation) Az osztály elérési útvonala is átküldődik Paraméter átvitel java.rmi.Remote megvalósító osztály Exportált: csonk adódik vissza Nem exportált: az objektum adódik vissza Egyéb osztály:

Szemét gyűjtés Referencia számláló szemét gyűjtő Minden JVM-en belül számon tartja az aktív referenciákat Referenced üzenet Együttműködés a helyi szemétgyűjtővel: Gyenge referencia Normál referencia

Dinamikus osztály betöltés Bármilyen objektum átvihető (serializable) Szükség van az osztály definícióra a másik oldalon is Unmarshalling: Megpróbálja a helyi gépen feloldani Ha nem megy akkor megpróbálja a távoli (az átivteli folyamban megadott annotateClass ) címről betölteni java.rmi.server.RMIClassLoader.getClassAnnotation

UnicastRemoteObject Távoli objektumok létrehozása és exportálása Tulajdonságok: A referencia csak a létrehozó processz futása alatt él TCP protokollt használ protected UnicastRemoteObject() protected UnicastRemoteObject(int port) protected UnicastRemoteObject(int port, RMIClientSocketFactory csf, RMIServerSocketFactory ssf) public Object clone() public static RemoteStub exportObject(java.rmi.Remote obj) public static Remote exportObject(java.rmi.Remote obj, int port) public static Remote exportObject(Remote obj, int port, public static boolean unexportObject(java.rmi.Remote obj, boolean force)

Aktiválható távoli objektum Sok objektum -> erőforrás foglalás A klienseknek meg kell őrizniük a referenciát (szemét gyűjtő) Szerver leállás esetén is megmarad Aktiválható objektum -> kérésre aktiválódik Aktív objektum Passzív objektum Lusta aktiválás Objektum aktiválás ID Tranziens objektum ID Aktiváló protokol: Aktivátor (aktiválás ID class hozzárendelés, JVM menedzselés) Objektum csoport azonosító (JVM) Osztály név URL Objektum specifikus adat Aktivációs csoport (ő kapja meg a kérést és továbbítja az aktivátornak) Távoli objektum

Használata rmid démon (egy JVM-et indít) Aktiválás regisztrálása Speciális konstruktor megvalósítása ActivationDesc osztály Csoport azonosító Osztálynév URL MarshalledObject ActivationID osztály Távoli hivatkozás az aktivátorra Az objektum egyedi azonosítója Activatable osztály Ebből érdemes származtatni az osztályunkat

Példa: Interfész deklarálás: Activatable megvalósotás: import java.rmi.*; public interface MyRemoteInterface extends Remote { public Object callMeRemotely() throws RemoteException;} Activatable megvalósotás: import java.rmi.*;import java.rmi.activation.*; public class ActivatableImplementation extends Activatable implements examples.activation.MyRemoteInterface { public ActivatableImplementation(ActivationID id, MarshalledObject data) throws RemoteException { super(id, 0); } public Object callMeRemotely() throws RemoteException { return "Success"; }}

Példa Setup osztály: public static void main(String[] args) throws Exception { System.setSecurityManager(new RMISecurityManager()); Properties props = new Properties(); props.put("java.security.policy", "/home/rmi_tutorial/activation/policy"); ActivationGroupDesc.CommandEnvironment ace = null; ActivationGroupDesc exampleGroup = new ActivationGroupDesc(props, ace); ActivationGroupID agi = ActivationGroup.getSystem().registerGroup(exampleGroup); String location = "file:/home/rmi_tutorial/activation/"; MarshalledObject data = null; ActivationDesc desc = new ActivationDesc (agi, "examples.activation.ActivatableImplementation", location, data); MyRemoteInterface mri = (MyRemoteInterface)Activatable.register(desc); Naming.rebind("ActivatableImplementation", mri); System.exit(0);

Futtatás javac rmic rmiregistry rmid -J-Djava.security.policy=rmid.policy & java setup java server java client

Enterprise Java Beans EJB: Érvek EJB mellett Szerver oldali komponens Java interfészek halmaza Specifikáció mely leírja a komponensek és az alkalmazásszerverek együttműködését Érvek EJB mellett Sokan támogatják Nyílt szabvány, elvileg gyártó független Gyors alkalmazás fejlesztés Platform független

EJB

EJB típusok Viszony Bab (Session Bean) Az üzleti folyamat modellezésére szolgál Munkafolyamat, árazás, hitel kártya engedélyező, … Entitás Bab (Entity Bean) (CSAK < =EJB2.0) Az üzleti adatot modellezik Termék, egyed, rendelés, … Entitások - JPA (Java Persistence API) (CSAK >= EJB 3.0) Üzenet vezérelt Bab (Message Driven Bean) Hasonló mint a viszony bab, csak üzenetekkel lehet kommunikálni vele

EJB példa

Az EJB objektum 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 MiddleWare Kivételek (transzparent fail- over): Alkalmazás szintű Rendszer szintű

Mitől EJB az EJB? EJB 2.0 EJB 3.0 javax.ejb.EnterpriseBean interfész Üres interfész, csak a neve a fontos A java.io.Serializable interfészt bővíti Az alábbi interfészek származnak belőle: javax.ejb.EntityBean javax.ejb.SessionBean javax.ejb.MessageDrivenBean EJB 3.0 POJO (@Stateless, interfészek @Remote, @Local )

Remote Interface Ezzel tudatjuk az EJB objektummal, hogy mely metódusokat szeretnénk távolról elérni (RMI-IIOP, RemoteExeption) Őse: javax.ejb.EJBObject extends java.rmi.Remote EJBHome getEJBHome() Handle getHandle() java.lang.Object getPrimaryKey() boolean isIdentical(EJBObject obj) void remove()

Home Objektum A kliens tőle kéri az EJB példányt (Helyszín Transzparens) Feladata: EJB objektumok létrehozása Meglévő EJB objektumok megtalálása EJB objektumok eltávolítása Tároló specifikus Automatikusan generált

Home Interfész Tudja hogyan kell az EJB objektumot inicializálni javax.ejb.EJBHome getEJBMetaData getHomeHandle remove

Local Interfész A Remote interfész használata lassú Helyette: 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 MiddleWare műveleteke Az EJB objektum meghívja Bab példányt és így vissza Helyette: A kliens meghívja a lokális objektumot A lokális objektum elvégzi a megfelelő MiddleWare műveleteket A Lokális objektum meghívja a Bab példányt javax.ejb.EJBLocalObject EJBLocalHome getEJBLocalHome() java.lang.Object getPrimaryKey() boolean isIdentical(EJBLocalObject 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)

Telepítés leírók 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 …

Ejb-jar fájlok Ezekben a fájlokban fogjuk össze komponensünket Elemei: 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

Entitás kezelés EJB 1,2.0 EJB 3.0, 3.1 Entitás bab Entitás – JPA = Hibernate 3.0

Egyed bab (Entity bean) 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 (ejbLoad(), ejbStore() a szinkronizáció a tároló feladata) Lehetséges megoldások: Serialization Objet-Relational Mapping Objektum adatbázisok Csak egy szál férhet hozzá egy időben -> több EJB ugyanaz az adat -> tranzakciók Gyűjteményezhető (Pooling) ejbActivate(), ejbPassivate() ejbStore(), ejbLoad() Adatbázis kód: Bean Managed Persistence Entity Bean – BMP Container Managed Persistence Entity Bean - CMP

Egyed bab Létrehozása, törlése (adatbázissal együtt!): ejbCreate() ejbRemove() Elsődleges kulcsot megvalósító osztály Az egyed babok kereshetőek Finder metódusok (home interfész) Az adatbázis módosításával módosul az egyed bab is (új is létrejön)!

Egyed bab környezet Javax.ejb.EntityContext extends EJBContext getEJBLocalObject(), getEJBObject() – (this) getPrimaryKey() – connection pooling ejbLoad ejbRemove

BMP Nekünk kell kézzel kódolnunk az adatbázis hozzárendelést javax.ejb.EntityBean setEntityContext ejbFind<..>– csak itt kell implementálni pl.: select id from x where w > 0, PrimaryKey ejbFindTheBiggest, … kötelező ejbFindByPrimaryKey ezeket meg kell adni a Local, vagy home interfészben EJBObject find<…> ejbHome<..> – globális műveletek (sorok megszámolása) ejbCreate – INSERT INTO … ejbActivate – socket, …. Nyitás ejbLoad – getPrimaryKey, Select … ejbStore – UPDATE ejbPassivate – socket,… zárás ejbRemove – getPrimaryKey, delete

Példa Remote interface Home interface PK Bean Deployment Descriptor

Távoli interfész public interface Account extends EJBObject { public void deposit(double amt) throws AccountException, RemoteException; public void withdraw(double amt) throws AccountException, RemoteException; public double getBalance() throws RemoteException; public String getOwnerName() throws RemoteException; public void setOwnerName(String name) throws RemoteException; public String getAccountID() throws RemoteException; public void setAccountID(String id) throws RemoteException; }

Helyi interfész public interface AccountHome extends EJBHome { Account create(String accountID, String ownerName) throws CreateException, RemoteException; public Account findByPrimaryKey(AccountPK key) throws FinderException, RemoteException; public Collection findByOwnerName(String name) throws FinderException, RemoteException; public double getTotalBankValue() throws AccountException, RemoteException; }

Elsődleges Kulcs public class AccountPK implements java.io.Serializable { public String accountID; public AccountPK(String id) { this.accountID = id; } public AccountPK() { public String toString() { return accountID; public int hashCode() { return accountID.hashCode(); public boolean equals(Object account) { return ((AccountPK)account).accountID.equals(accountID);

Bean public class AccountBean implements EntityBean { protected EntityContext ctx; private String accountID; // PK private String ownerName; private double balance; public double getBalance() { System.out.println("getBalance() called."); return balance; } public void setOwnerName(String name) { System.out.println("setOwnerName() called."); ownerName = name; …

Bean: ejbFind… public Collection ejbFindByOwnerName(String name) throws FinderException { PreparedStatement pstmt = null; Connection conn = null; Vector v = new Vector(); try { System.out.println("ejbFindByOwnerName(" + name + ") called"); conn = getConnection(); pstmt = conn.prepareStatement("select id from accounts where ownerName = ?"); pstmt.setString(1, name); ResultSet rs = pstmt.executeQuery(); while (rs.next()) { String id = rs.getString("id"); v.addElement(new AccountPK(id));} return v; } catch (Exception e) { throw new FinderException(e.toString());} finally { try { if (pstmt != null) pstmt.close(); } catch (Exception e) {} try { if (conn != null) conn.close(); }catch (Exception e) {}

Bean: Remove public void ejbRemove() throws RemoveException { AccountPK pk = (AccountPK) ctx.getPrimaryKey(); String id = pk.accountID; PreparedStatement pstmt = null; Connection conn = null; try { conn = getConnection(); pstmt = conn.prepareStatement("delete from accounts where id = ?"); pstmt.setString(1, id); if (pstmt.executeUpdate() == 0) { throw new RemoveException("Account " + pk + " failed to be removed from the database"); } catch (Exception ex) {throw new EJBException(ex.toString());} finally { try { if (pstmt != null) pstmt.close(); } catch (Exception e) {} try { if (conn != null) conn.close(); }catch (Exception e) {}

Telepítés leíró/1 <ejb-jar> <enterprise-beans> <entity> <ejb-name>Account</ejb-name> <home>examples.AccountHome</home> <remote>examples.Account</remote> <local-home>examples.AccountLocalHome</local-home> <local>examples.AccountLocal</local> <ejb-class>examples.AccountBean</ejb-class> <persistence-type>Bean</persistence-type> <prim-key-class>examples.AccountPK</prim-key-class> <reentrant>False</reentrant> <resource-ref> <res-ref-name>jdbc/ejbPool</res-ref-name> <res-type>javax.sql.DataSource</res-type> <res-auth>Container</res-auth> </resource-ref> </entity> </enterprise-beans>

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> <method-intf>Remote</method-intf> <trans-attribute>Required</trans-attribute> </container-transaction> </assembly-descriptor> </ejb-jar>

CMP 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)

CMP metódusok ejbSelect<..> – ezzel is kitehetjük az SQL-t a leíróba (ejbSelectAllAccountBalances) Csak a babon belül hívható Absztrakt metódus ejbHome<..> ezen belül használjuk az ejbSelect-et

Példa Bab Telepítő

Bab public abstract class ProductBean implements EntityBean { protected EntityContext ctx; public ProductBean() { } public abstract String getName(); public abstract void setName(String name); public abstract String getDescription(); public String ejbCreate(String productID, String name, String description, double basePrice) { System.out.println("ejbCreate() called"); setProductID(productID); setName(name); setDescription(description); setBasePrice(basePrice); return productID; }

Telepítés leíró <ejb-name>Product</ejb-name> <home>examples.ProductHome</home> <remote>examples.Product</remote> <ejb-class>examples.ProductBean</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>ProductBean</abstract-schema-name> <cmp-field> <field-name>name</field-name> </cmp-field> <primkey-field>productID</primkey-field> <query> <query-method> <method-name>findByName</method-name> <method-params> <method-param>java.lang.String</method-param> </method-params> </query-method> <ejb-ql> <![CDATA[Select OBJECT(a) FROM ProductBEan AS a WHERE name = ?1]]> </ejb-ql> </query> </entity>

BMP, CMP életciklus

Entitás (>=EJB 3.0)

Viszony bab (Session Bean) Ü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 Három típusa van: Állapot mentes (Stateless) Egy metódus hívásig él Nem őrzi meg állapotát Minden egyede egyenlő, újrahasznosítható, készletezhető Állapottal 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) Singelton Egy van belőle, megőrzi az állapotát

Életciklusok

Példa @Singleton @ConcurrencyManagement(BEAN) public class DiscountRateBean { @PersistenceContext private EntityManager entityManager; private Rate rate; @PostConstruct private void init() { rate = entityManager.find(Rate.class, 1); } @PreDestroy private void destroy() { entityManager.merge(rate); public synchronized void setRate(Rate rate) { this.rate = rate; public synchronized Rate getRate() { return rate;

Teljes működés

Üzenet vezérelt bab (Message driven bean) Az előző komponensek RMI-IIOP-ot használtak kommunikációra Hátrányai: A kliensnek várnia kell a válaszra (nem engedélyezetett a szál kezelés !!) Nem megbízható Egyszerre csak egy egyeddel kommunikál Message Oriented MiddleWare MSMQ, IBM MQSeries, … cég függő JMS szabványos igyekszik lenni (API/SPI)

JMS API Messaging Domains: Publish/subscribe Point-to-Point

Üzenet vezérelt bab Teljesen el van különítve a többi komponenstől Nincs home, remote, local, localhome interfész Egy üzleti metódusuk van onMessage() 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 javax.jms.MessageListener onMessage() javax.ejb.MessageDrivenBean ejbRemove setMessageDrivenContext

Példa: Bean

Tranzakció kezelés A tranzakciók használata bevált megoldás az adat integritás megőrzése érdekében Hibák, komplex helyzetek Több felhasználó kezelése A folyamatokat munka egységekbe tudjuk osztani Hogyan oldjuk ezt meg amennyiben nem adatbázisban végezzük el a megfelelő műveleteket EJB két típust támogat Bab által kezelt tranzakciók Konténer által kezelt tranzakciók

Konténer által kezelt tranzakció kezelés A konténer szabja meg a tranzakció határokat Viszony és üzenet babbal tudjuk használni Egyszerűsíti a fejlesztést mert alapesetben nem kell vele foglalkoznunk Tipikus eset A tároló adott bab metódus meghívásával egy új tranzakciót kezd amit befejez amint a metódus visszatért Minden metódus egy-egy külön tranzakció Nem lehet egyszerre használni a bab által kezelt tranzakció kezeléssel Metódus szinten specifikálhatjuk a tranzakció igényeket

Tranzakció hatóköre

Példa

Bab által kezelt tranzakció kezelés Akkor szokták használni a ha a tranzakció határokat kézben szeretnénk tartani Az előzőnél egy metódus egy tranzakcióhoz tartozhat JDBC vagy JTA tranzakciókezelést lehet használni

A mai előadás tartalma: Alkalmazás keretrendszerek JEE Erőforráskezelés JNDI Tranzakciókezelés Tároló által menedzselt tranzakciók Bab által menedzselt tranzakciók EJB RMI JPA

A következő előadás tartalma Spring Architektúra IOC (Függőség injektálás) AOP Adatbázis OSGI Biztonság Modul kezelés Életciklus kezelés Keretrendszer API