Title: Programrendszerek Fejleszt
1Programrendszerek Fejlesztése
2A mai eloadás tartalma
- Alkalmazás keretrendszerek
- JEE
- Eroforráskezelés
- JNDI
- Tranzakciókezelés
- Tároló által menedzselt tranzakciók
- Bab által menedzselt tranzakciók
- EJB
- RMI
- JPA
- EJB
3Vállalati szoftver
- 10 ügyvéd 11 féle válasz
- Több mint egy weboldal
- 2 vagy több rétegu architektúra
- Komponens alapú elosztott rendszerek
- Együttmuködés más rendszerekkel
- Karbantartható kód/alkalmazás
4Példa
Kliens
Kliens
Kliens
Kliens
Szerver
Szerver
Szerver
Szerver
Szerver
Címtár
Adatbázis
Adatbázis
5Megoldandó problémák
- Távoli eljárás hívás
- Terhelés elosztás
- Transzparens hiba turés
- Együttmukö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
- Eroforrás gyujtemény
- Biztonság
- Gyorstár
6Megoldás
- Minden cég megírja a saját szoftverét
- Komplex problémák
- Egyedi tudás
- Drága
- Elore megírt komponenseket használ (MiddleWare)
- Tesztelt, kevesebb hibával rendelkezo
- Olcsóbb (TCO)
- A saját problémájával foglalkozhat
7Komponens architektúrák
- Explicit MiddleWare
- Komplex API gyujtemény melyet nekünk kell
hívogatnunk - Implicit MiddleWare
- Csak az üzleti logikával kell foglalkoznunk
- Konfiguráció fájl -gt Kérés elfogó (Request
Interceptor) - Megoldások
- CORBA Component Model
- .NET
- J2EE - EJB
8Alkalmazá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
9Szolgá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 szintu 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étegbol 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?
10Alkalmazá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ó szintu szolgáltatásokat
(tranzakciók, biztonság, ) - Sok alkalmazásban nincs megfeleloen definiálva
11Alkalmazás keretrendszerek
12Java 2 Enterprise Edition
- J2EE tartalmazza a J2SE-t
- API, szabvány, tervezési minta gyujtemény
- Elemei (rétegek szerint)
- Prezentáció
- Adat tárolás kinyerés
- Kommunikáció
13API gyujtemény
- JDBC
- JNDI
- EJB
- JAX
- SAX
- DOM
- JTA
- JAAS
14Megvalósítások
- Tomcat
- JBoss
- WebSphere
- iPlanet
- J2EE SDK
-
- http//www.javaskyline.com/serv.html
15EJB rendszer
- Bean fejleszto
- Telepítheto adott funkciót ellátó komponenesket
gyárt - Alkalmazás szintetizáló
- O látja át az adott problémát és tervezi meg
hozzá az alkalkalmazást - EJB telepíto
- Biztonsági, integrációs kérdések (LDAP, tuzfal,
) - Rendszer Adminisztrátor
- Rendszer menedzsment, monitorozás,
- Alkalmazás szerver gyártó
- Fejleszto eszköz gyártók
16Eroforrás hozzáférés
- A JEE komponensek sok fajta eroforrá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
17JNDI
- Java Naming and Directory Interface
- A J2EE legfontosabb összetevoje (a J2SEE nek is
része) - Feladata
- Objektumok referenciáinak tárolása keresheto
formában - Együttmukö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.
18Elnevezés, Címtár
- Elnevezés (Naming)
- 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,
19JNDI csomagok
- javax.naming
- Kontesztus (Context)
- Kezdo 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
20Haszná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
ltfilenamegt") - System.exit(-1)
- String name args0
- 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()
21Kötés, Konteksztus
- Kötés
- bind, rebind, unbind, rename
- 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")
22Haszná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//localhost3
89/oJNDITutorial") - env.put(Context.SECURITY_PRINCIPAL, "joeuser")
- env.put(Context.SECURITY_CREDENTIALS,
"joepassword") - try
- DirContext ctx new InitialDirContext(env)
- Attributes attrs ctx.getAttributes("cnTed
Geisel, ouPeople") - System.out.println("sn "
attrs.get("sn").get()) - ctx.close()
- catch (NamingException e)
23Attribútum,
- Attribútum hierarchia
- Név vezetéknév
- Attributes answer ctx.getAttributes("cnTed
Geisel, ouPeople") - 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 ModificationItem3
- mods0 new ModificationItem(DirContext.REPLACE_
ATTRIBUTE, new BasicAttribute("mail",
"geisel_at_wizards.com")) - mods1 new ModificationItem(DirContext.ADD_ATTR
IBUTE, - new BasicAttribute("telephonenumber", "1 555
555 5555")) - mods2 new ModificationItem(DirContext.REMOVE_A
TTRIBUTE, - new BasicAttribute("jpegphoto"))
24Keresés, Kötés
- Search
- Attributes matchAttrs new BasicAttributes(true)
// ignore attribute name case - matchAttrs.put(new BasicAttribute("sn",
"Geisel")) - matchAttrs.put(new BasicAttribute("mail"))
- NamingEnumeration answer ctx.search("ouPeople",
matchAttrs) - String attrIDs "sn", "telephonenumber",
"golfhandicap", "mail" - NamingEnumeration answer ctx.search("ouPeople",
matchAttrs, attrIDs) - Search control, Search filter
- String attrIDs "sn", "telephonenumber",
"golfhandicap", "mail" - SearchControls ctls new SearchControls()
- ctls.setReturningAttributes(attrIDs)
- ctls.setSearchScope(SearchControls.SUBTREE_SCOPE)
- ctls.setCountLimit(1) ctls.setTimeLimit(1000)
- String filter "((snGeisel)(mail))"
- NamingEnumeration answer ctx.search("ouPeople",
filter, ctls) - Binding
- Attributes attrs new BasicAttributes(true) //
case-ignore - Attribute objclass new BasicAttribute("objectcla
ss") - objclass.add("top") objclass.add("organizationalU
nit")attrs.put(objclass)
25Eroforrás injektálás
- A konténer automatikusan beinyektálja a
megfeleloen annotált mezobe/tulajdonságba - Inicializáláskor (mezo/tulajdonság)
- Futás idoben (osztály alapú)
- _at_Resource
- Név (name)
- Típus (type)
- Azonosítás típusa (authenticationType)
- Megosztható (shareable)
- Csatolás neve (mappedName)
- Leírás (dessc)
26Elosztott 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
27RMI
- Remote Method Invocation
- Objektum orientált RPC
- Teljes objektumokat tudunk átküldeni, nem csak
elore definiált típusokat - Java specifikus
- Elosztott szemétgyujto
- Biztonságos
- Egyszeru (nincs IDL)
- URl szeru rmi//hostport/objektumnév
28Különbségek
- Elosztott vs. Normál Java alkalmazás
- Távoli objektum hivatkozása használható
- A Cast ugyanúgy mukö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
29Felépítése
- Java.RMI.remote interfész
- Ezt kell boví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 szerepelo
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
30Mukö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ötelezo) - Szerver oldali reprezentáció
- Kiolvassa a paramétereket és visszaalakítja oket
(unmarshals) - Meghívja a megfelelo objektum megfelelo metódusát
- Átalakítja és átküldi az eredményt (marshals)
31Használata
- Távoli interfész deklarálá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/Weather
Service" - Naming.rebind( serverObjectName, service )
- Kliens megvalósítás
- String remoteName "rmi//" server
"/WeatherService" - WeatherService weatherService ( WeatherService )
Naming.lookup( remoteName ) - List weatherInformation weatherService.getWeathe
rInformation() - Fordítás
- Javac
- Rmic -gt csonk osztályok (rmic v1.2 -gt vázat is
gyárt)
32Paraméter átadás
- Serializable (mentheto) 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üldodik
- 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
- Nem exportált az objektum adódik vissza
33Szemét gyujtés
- Referencia számláló szemét gyujto
- Minden JVM-en belül számon tartja az aktív
referenciákat - Referenced üzenet
- Együttmuködés a helyi szemétgyujtovel
- Gyenge referencia
- Normál referencia
34Dinamikus osztály betöltés
- Bármilyen objektum átviheto (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ímrol betölteni - java.rmi.server.RMIClassLoader.getClassAnnotation
35UnicastRemoteObject
- 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.Re
mote obj) - public static Remote exportObject(java.rmi.Remote
obj, int port) - public static Remote exportObject(Remote obj,
int port, -
RMIClientSocketFactory csf, -
RMIServerSocketFactory ssf) - public static boolean unexportObject(java.rmi.Rem
ote obj, -
boolean force)
36Aktiválható távoli objektum
- Sok objektum -gt eroforrás foglalás
- A klienseknek meg kell orizniük a referenciát
(szemét gyujto) - Szerver leállás esetén is megmarad
- Aktiválható objektum -gt 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 (o kapja meg a kérést és
továbbítja az aktivátornak) - Távoli objektum
37Haszná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
- Ebbol érdemes származtatni az osztályunkat
38Példa
- Interfész deklarálá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.MyRemoteInterf
ace - public ActivatableImplementation(ActivationID id,
MarshalledObject data) - throws RemoteException super(id, 0)
- public Object callMeRemotely() throws
RemoteException - return "Success"
39Pé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.getSyst
em().registerGroup(exampleGroup) - String location "file/home/rmi_tutorial/activat
ion/" - MarshalledObject data null
- ActivationDesc desc new ActivationDesc (agi,
"examples.activation.ActivatableImplementation", - location, data)
- MyRemoteInterface mri (MyRemoteInterface)Activat
able.register(desc) - Naming.rebind("ActivatableImplementation", mri)
- System.exit(0)
-
40Futtatás
- javac
- rmic
- rmiregistry
- rmid -J-Djava.security.policyrmid.policy
- java setup
- java server
- java client
41Enterprise Java Beans
- EJB
- Szerver oldali komponens
- Java interfészek halmaza
- Specifikáció mely leírja a komponensek és az
alkalmazásszerverek együttmukö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
42EJB
43EJB típusok
- Viszony Bab (Session Bean)
- Az üzleti folyamat modellezésére szolgál
- Munkafolyamat, árazás, hitel kártya engedélyezo,
- Entitás Bab (Entity Bean) (CSAK lt EJB2.0)
- Az üzleti adatot modellezik
- Termék, egyed, rendelés,
- Entitások - JPA (Java Persistence API) (CSAK gt
EJB 3.0) - Üzenet vezérelt Bab (Message Driven Bean)
- Hasonló mint a viszony bab, csak üzenetekkel
lehet kommunikálni vele
44EJB példa
45Az 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 szintu
- Rendszer szintu
46Mitol EJB az EJB?
- EJB 2.0
- javax.ejb.EnterpriseBean interfész
- Üres interfész, csak a neve a fontos
- A java.io.Serializable interfészt bovíti
- Az alábbi interfészek származnak belole
- javax.ejb.EntityBean
- javax.ejb.SessionBean
- javax.ejb.MessageDrivenBean
- EJB 3.0
- POJO (_at_Stateless, interfészek _at_Remote, _at_Local )
47Remote Interface
- Ezzel tudatjuk az EJB objektummal, hogy mely
metódusokat szeretnénk távolról elérni (RMI-IIOP,
RemoteExeption) - Ose
- javax.ejb.EJBObject extends java.rmi.Remote
- EJBHome getEJBHome()
- Handle getHandle()
- java.lang.Object getPrimaryKey()
- boolean isIdentical(EJBObject obj)
- void remove()
48Home Objektum
- A kliens tole kéri az EJB példányt (Helyszín
Transzparens) - Feladata
- EJB objektumok létrehozása
- Meglévo EJB objektumok megtalálása
- EJB objektumok eltávolítása
- Tároló specifikus
- Automatikusan generált
49Home Interfész
- Tudja hogyan kell az EJB objektumot inicializálni
- javax.ejb.EJBHome
- getEJBMetaData
- getHomeHandle
- remove
50Local Interfész
- A Remote interfész használata lassú
- Kliens a helyi csonkhoz fordul
- A helyi csonk átalakítja a paramétereket
hálózaton hasznáhatóvá - A váz Visszaalakítja oket
- A váz meghívja az EJB objektumot
- Az EJB végrehajtja a szükséges MiddleWare
muveleteke - 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 megfelelo MiddleWare
muveleteket - 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ésobb problémás lehet átalakítani)
51Telepí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érol - Bab menedzsment
- Tranzakció
- Biztonság
-
52Ejb-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
53Entitás kezelés
- EJB 1,2.0
- Entitás bab
- EJB 3.0, 3.1
- Entitás JPA
- Hibernate 3.0
54Egyed 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 idoben -gt több EJB
ugyanaz az adat -gt tranzakciók - Gyujteményezheto (Pooling)
- ejbActivate(), ejbPassivate()
- ejbStore(), ejbLoad()
- Adatbázis kód
- Bean Managed Persistence Entity Bean BMP
- Container Managed Persistence Entity Bean - CMP
55Egyed bab
- Létrehozása, törlése (adatbázissal együtt!)
- ejbCreate()
- ejbRemove()
- Elsodleges kulcsot megvalósító osztály
- Az egyed babok kereshetoek
- 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)!
56Egyed bab környezet
- Javax.ejb.EntityContext extends EJBContext
- getEJBLocalObject(), getEJBObject() (this)
- getPrimaryKey() connection pooling
- ejbLoad
- ejbRemove
57BMP
- Nekünk kell kézzel kódolnunk az adatbázis
hozzárendelést - javax.ejb.EntityBean
- setEntityContext
- ejbFindlt..gt csak itt kell implementálni pl.
select id from x where w gt 0, - PrimaryKey ejbFindTheBiggest,
- kötelezo ejbFindByPrimaryKey
- ezeket meg kell adni a Local, vagy home
interfészben - EJBObject findltgt
- ejbHomelt..gt globális muveletek (sorok
megszámolása) - ejbCreate INSERT INTO
- ejbActivate socket, . Nyitás
- ejbLoad getPrimaryKey, Select
- ejbStore UPDATE
- ejbPassivate socket, zárás
- ejbRemove getPrimaryKey, delete
58Példa
- Remote interface
- Home interface
- PK
- Bean
- Deployment Descriptor
59Tá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
60Helyi 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
61Elsodleges 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(ac
countID) -
62Bean
- 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
-
63Bean 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) -
-
64Bean 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) -
-
65Telepítés leíró/1
- ltejb-jargt
- ltenterprise-beansgt
- ltentitygt
- ltejb-namegtAccountlt/ejb-namegt
- lthomegtexamples.AccountHomelt/homegt
- ltremotegtexamples.Accountlt/remotegt
- ltlocal-homegtexamples.AccountLocalHomelt/local-ho
megt - ltlocalgtexamples.AccountLocallt/localgt
- ltejb-classgtexamples.AccountBeanlt/ejb-classgt
- ltpersistence-typegtBeanlt/persistence-typegt
- ltprim-key-classgtexamples.AccountPKlt/prim-key-cl
assgt - ltreentrantgtFalselt/reentrantgt
- ltresource-refgt
- ltres-ref-namegtjdbc/ejbPoollt/res-ref-namegt
- ltres-typegtjavax.sql.DataSourcelt/res-typegt
- ltres-authgtContainerlt/res-authgt
- lt/resource-refgt
- lt/entitygt
- lt/enterprise-beansgt
66Telepítés leíró /2
-
- ltassembly-descriptorgt
- ltcontainer-transactiongt
- ltmethodgt
- ltejb-namegtAccountlt/ejb-namegt
- ltmethod-intfgtLocallt/method-intfgt
- ltmethod-namegtlt/method-namegt
- lt/methodgt
- ltmethodgt
- ltejb-namegtAccountlt/ejb-namegt
- ltmethod-intfgtRemotelt/method-intfgt
- ltmethod-namegtlt/method-namegt
- lt/methodgt
- lttrans-attributegtRequiredlt/trans-attributegt
- lt/container-transactiongt
- lt/assembly-descriptorgt
- lt/ejb-jargt
67CMP
- A bab fejleszto 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 mezok az alosztályban vannak definiálva (ez
tároló függo) - A get/set metódusok az alosztályban vannak
definiálva - Az ososztályt mint absztrakt osztályt kell
definiálni! - A megfelelo 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érdezo nyelv EJB-QL (SELECT OBJECT(a)
FROM Accoun As a)
68CMP metódusok
- ejbSelectlt..gt ezzel is kitehetjük az SQL-t a
leíróba (ejbSelectAllAccountBalances) - Csak a babon belül hívható
- Absztrakt metódus
- ejbHomelt..gt ezen belül használjuk az ejbSelect-et
69Példa
70Bab
- 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
-
71Telepítés leíró
- ltejb-namegtProductlt/ejb-namegt
- lthomegtexamples.ProductHomelt/homegt
- ltremotegtexamples.Productlt/remotegt
- ltejb-classgtexamples.ProductBeanlt/ejb-classgt
- ltpersistence-typegtContainerlt/persistence-typegt
- ltprim-key-classgtjava.lang.Stringlt/prim-key-clas
sgt - ltreentrantgtFalselt/reentrantgt
- ltcmp-versiongt2.xlt/cmp-versiongt
- ltabstract-schema-namegtProductBeanlt/abstract-sch
ema-namegt - ltcmp-fieldgt
- ltfield-namegtnamelt/field-namegt
- lt/cmp-fieldgt
- ltprimkey-fieldgtproductIDlt/primkey-fieldgt
- ltquerygt
- ltquery-methodgt
- ltmethod-namegtfindByNamelt/method-namegt
- ltmethod-paramsgt
- ltmethod-paramgtjava.lang.Stringlt/method-param
gt - lt/method-paramsgt
72BMP, CMP életciklus
73Entitás (gtEJB 3.0)
74Viszony bab (Session Bean)
- Üzleti folyamatot valósít meg
- Nem mentodnek el a tartós tároló helyre
- Rövid életuek (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 orzi meg állapotát
- Minden egyede egyenlo, újrahasznosítható,
készletezheto - Állapottal rendelkezo (Statefull)
- Több egymást követo kérést tranzakciót képes
kiszolgálni - Megorzi az állapotát (a viszony idejére)
- Készletezés passivation, activation (eroforrások
menedzselése) - Singelton
- Egy van belole, megorzi az állapotát
75Életciklusok
76Példa
- _at_Singleton
- _at_ConcurrencyManagement(BEAN)
- public class DiscountRateBean
- _at_PersistenceContext
- private EntityManager entityManager
- private Rate rate
- _at_PostConstruct
- private void init()
- rate entityManager.find(Rate.class, 1)
-
- _at_PreDestroy
- private void destroy()
- entityManager.merge(rate)
-
- public synchronized void setRate(Rate rate)
- this.rate rate
-
- public synchronized Rate getRate()
- return rate
77Teljes muködés
78Üzenet vezérelt bab (Message driven bean)
- Az elozo 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üggo
- JMS szabványos igyekszik lenni (API/SPI)
79JMS API
- Messaging Domains
- Publish/subscribe
- Point-to-Point
80Üzenet vezérelt bab
- Teljesen el van különítve a többi komponenstol
- 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üldonek
- Á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
81Példa Bean
82Tranzakció kezelés
- A tranzakciók használata bevált megoldás az adat
integritás megorzé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 megfelelo muveleteket - EJB két típust támogat
- Bab által kezelt tranzakciók
- Konténer által kezelt tranzakciók
83Konténer által kezelt tranzakció kezelés
- A konténer szabja meg a tranzakció határokat
- Viszony és üzenet babbal tudjuk használni
- Egyszerusí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
84Tranzakció hatóköre
85Példa
86Bab által kezelt tranzakció kezelés
- Akkor szokták használni a ha a tranzakció
határokat kézben szeretnénk tartani - Az elozonél egy metódus egy tranzakcióhoz
tartozhat - JDBC vagy JTA tranzakciókezelést lehet használni
87(No Transcript)
88A mai eloadás tartalma
- Alkalmazás keretrendszerek
- JEE
- Eroforráskezelés
- JNDI
- Tranzakciókezelés
- Tároló által menedzselt tranzakciók
- Bab által menedzselt tranzakciók
- EJB
- RMI
- JPA
- EJB
89A következo eloadás tartalma
- Spring
- Architektúra
- IOC (Függoség injektálás)
- AOP
- Adatbázis
- OSGI
- Biztonság
- Modul kezelés
- Életciklus kezelés
- Keretrendszer API