enterprise beans java ee 6 platform ejb 3.1
DESCRIPTION
Enterprise Beans Java EE 6 platform EJB 3.1. Ficsor Lajos , Krizsán Zoltán Á l talános Informati kai Tanszék Miskolc i Egyetem Utolsó módosítás: 2012. 04. 10. Az Enterprise Beans. Az Enterprise JavaBeans ( EJB ) szerver oldali komponens, amely - PowerPoint PPT PresentationTRANSCRIPT
Az Enterprise JavaBeans 3.1
Enterprise BeansEnterprise BeansJava EE Java EE 66 platform platform
EJB 3.1 EJB 3.1
Ficsor Lajos, Krizsán Zoltán
Általános Informatikai Tanszék
Miskolci EgyetemUtolsó módosítás: 2012. 04. 10.
Az Enterprise JavaBeans 3.1 EJB31 / 2
Az Enterprise BeansAz Enterprise Beans
Az Enterprise JavaBeans (EJB) szerver oldali komponens, amely
Az üzleti logika valamely elemének reprezentációja
Egy konténerben fut
A konténer szolgáltatásokat biztosít a bean számára• tranzakciókezelés
• perzisztencia
• biztonsági funkciók
A kliens soha nem közvetlenül az EJB-vel van kapcsolatban, hanem a konténerrel
Az Enterprise JavaBeans 3.1 EJB31 / 3
A kliens és az EJB kapcsolataA kliens és az EJB kapcsolata
Az Enterprise JavaBeans 3.1 EJB31 / 4
Az Enterprise BeansAz Enterprise Beans fajt fajtááii
Session Bean (stateless, statefull és singleton)
Message-Driven Bean
AJava EE 5 platformtól az Entity Bean megszűnt, helyette egy új perzisztencia API került a szabványba
Az Enterprise JavaBeans 3.1 EJB31 / 5
A session BeanA session Bean
Egy egyszerű kliens kérést reprezentál a szerverenElválasztja a klienst a szerver által végzett bonyolultabb tevékenységektőlÁltalában egy klienst tud kiszolgálni egyszerreHa a kliens terminálódik, a bean is megszűnikHa a szerver leáll, a bean elvészHárom fajtája van:
Stateful (állapottal rendelkező) session beanStateless (állapot nélküli) session beanSingleton session bean
Az Enterprise JavaBeans 3.1 EJB31 / 6
Stateful session beanStateful session bean
Megőrzi a kliens egyes hívásai között az adatokat
Ha a szervernek memóriát kell felszabadítania, a bean-t el kell mentenie, majd szükség esetén visszaállítania
Az Enterprise JavaBeans 3.1 EJB31 / 7
Stateless session beanStateless session bean
Semmilyen klienssel kapcsolatos információt nem őriz meg a kliensek hívásai között
Csak egy metódus végrehajtásának idejére tud adatokat megőrizni
Bármely példány egyenértékű a kliensek számára
Metódushívás idején kívül a szerver kisöpörheti a memóriából lementés nélkül
Hatékonyabban tud működni
Az Enterprise JavaBeans 3.1 EJB31 / 8
Singleton session beanSingleton session bean
Egy példányban létezik egy alkalmazásban
Életciklusa az alkalmazással azonos
A kliensek konkurrens módon használhatják
Elláthat az alkalmazás indulásával kapcsolatos inicializálási feladatokat
Az Enterprise JavaBeans 3.1 EJB31 / 9
Stateful session bean használataStateful session bean használata
Vannak a kliens és a bean párbeszédére jellemző adatok
Vannak két hívás között megőrzendő adatok
A bean valójában összekötő elem a kliens és az alkalmazás más komponense(i) között
A bean más EJB-k közötti munkamegosztást vezérel
Az Enterprise JavaBeans 3.1 EJB31 / 10
Stateless session bean használataStateless session bean használata
Nincs kliens specifikus adat
Általános feladatot lát el a kliensek részére
A kliens és a bean kommunikációja szinkron módon történik
Hatékonyabb lehet, mint a stateful bean
Implementálhat web szolgáltatást
Az Enterprise JavaBeans 3.1 EJB31 / 11
Singleton session bean használataSingleton session bean használata
Az állapotát az alkalmazás teljes életciklusára meg kell őriznie
Több kliens egyszerre, konkurrens módon kell használja
Feladatokat láthat el az alkalmazás indulása és leállása során
Implementálhat web szolgáltatást
Az Enterprise JavaBeans 3.1 EJB31 / 12
A Message-Driven bean (MDB)A Message-Driven bean (MDB)
Olyan bean, amely JMS üzenetek figyelésére képes. (Implementálnia kell a javax.jms.MessageListener interface-t.) Más üzenetkezelő rendszer része is lehet.Különbségek a session bean-el szemben:
A kliense nem érheti el interface-en keresztül.Csak bean osztálya van.A kliens nem tudja meghívni direkt módon egyetlen metódusát sem.
Az Enterprise JavaBeans 3.1 EJB31 / 13
A Message-Driven bean (folyt.)A Message-Driven bean (folyt.)
Hasonlóságok:Nem tárol adatokat a klienséről.
A bean minden példánya egyenértékű.
Tetszőleges kliensektől érkező üzeneteket fel tud dolgozni.
Az Enterprise JavaBeans 3.1 EJB31 / 14
A Message-Driven bean (folyt.)A Message-Driven bean (folyt.)
Legfontosabb tulajdonságaiEgy kliens üzenet hatására lép működésbe.Aszinkron módon működik.Viszonylag rövid életű.Nem reprezentál perzisztens adatokat, de képes adatbázis elérésre.Működhet tranzakcionális módon.Állapot mentesHa egy üzenet érkezik, a konténer meghívja a bean onMessage metódusát.
Az Enterprise JavaBeans 3.1 EJB31 / 15
A message-driven bean használataA message-driven bean használata
A session bean és kliensének kommunikációja az interface-én keresztül szinkron.
Session bean-ek kommunikálhatnak egymással JMS-en keresztül is, de a fogadott üzenet feldolgozása akkor is szinkron módon történik.
Ha aszinkron üzenet feldolgozásra van szükség, ahhoz message-driven bean kell.
Az Enterprise JavaBeans 3.1 EJB31 / 16
Session Bean-ek eléréseSession Bean-ek elérése
no-interface viewa bean osztály public metódusaihasonlóan használhatjuk, mintha egy egyszerű objektum lenne, de
nem kell példányosítania konténer szolgáltatásai transzparensek a kliens számára
business interfaceamit a bean osztályának implementálnia kelltöbb interface-t is implementálhat
Az Enterprise JavaBeans 3.1 EJB31 / 17
Elérés a kliensbőlElérés a kliensből
referencia megszerzése dependency injection alapján
egyszerű: elég a javax.ejb.EJB annotáció használata
a kliensneknek a Java EE környezetben kell futnia. Pl:• JSF web alkalmazás
• JAX-RS web szolgáltatás
• más enterprise bean
• Java EE application client
referencia megszerzése JNDI támogatássalJava EE környezeten kívüli kliensek számára
Az Enterprise JavaBeans 3.1 EJB31 / 18
remote és local elérési mód remote és local elérési mód
A döntés szempontjai:beanek közötti függőség foka – gyakran hívják egymásta kliens fajtája – lehet, hogy másik gépen futskálázhatóság: a lokális élérésű bean nehezebben telepíthető átteljesítmény: a lokális elérés nyilván "olcsóbb"
Egy bean technikailag felkészíthető mindkét elérési módra, de ezt ritkán alkalmazzukHa bizonytalanok vagyunk a döntésben, remote elérést válasszunk - rugalmasság
Az Enterprise JavaBeans 3.1 EJB31 / 19
Lokális elérésLokális elérés
A kliens ugyanabban az alkalmazásban van
Lehetweb komponens
másik EJB
A kliens számára az elérni kívánt EJB helye nem transzparens
Paraméterek, visszatérési érték referencia szerint
Az Enterprise JavaBeans 3.1 EJB31 / 20
Lokális elérésű bean készítéseLokális elérésű bean készítése
Nem interfész nézet: csak a bean osztályt kell definiálni: @Session
public class MyBean { ... }
Lokális interface:@Local
public interface InterfaceName { ... }
@Local(InterfaceName.class)
public class BeanName implements InterfaceName { ... }
Az Enterprise JavaBeans 3.1 EJB31 / 21
Lokális elérésű bean használataLokális elérésű bean használata
Lokális nem interfész nézet
Nem kell new
Osztály neve a típus@EJBExampleBean exampleBean;vagyExampleBean exampleBean = (ExampleBean)
InitialContext.lookup("java:module/ ExampleBean");
Az Enterprise JavaBeans 3.1 EJB31 / 22
Lokális elérésű bean használata (folyt.)Lokális elérésű bean használata (folyt.)
Lokális interfészen keresztül
Nem kell new
Interface neve a típus@EJBBeanInterface exampleBean;vagyBeanInterface exampleBean = (BeanInterface)
InitialContext.lookup("java:module/BeanInterface");
Az Enterprise JavaBeans 3.1 EJB31 / 23
remote elérésremote elérésA kliens futhat másik gépen / JVM-benLehet lokális isLehet
web komponensalkalmazás kliens (application client)másik EJB
A bean osztálynak implementálnia kell az üzleti interfészt. (Nem interfész nézet nincs!)Az elérendő bean helye transzparens a kliens számáraParaméterek, visszatérési érték érték szerint -Másolat!!!
Az Enterprise JavaBeans 3.1 EJB31 / 24
remote elérésű bean készítéseremote elérésű bean készítése
@Remote
public interface InterfaceName { ... }
@Remote(InterfaceName.class)
public class BeanName implements InterfaceName { ... }
Az Enterprise JavaBeans 3.1 EJB31 / 25
remote elérésű bean használataremote elérésű bean használata
Típus az interface!
@EJB
Example example;
vagy
ExampleRemote example = (ExampleRemote)
InitialContext.lookup("java:global/myApp/ExampleRemote");
Az Enterprise JavaBeans 3.1 EJB31 / 26
EJB kiadásaEJB kiadása
EJB JAR állományokban -> EAR
3.1-től WAR fájlbanWEB-INF/classes – osztályok
WEB-INF/lib – jar fájlok
Nem kell ejb-jar.xml, ha van helye: a META-INF
EJB-k kapcsolataiEJB-k kapcsolatai
Az Enterprise JavaBeans 3.1 EJB31 / 27
EJB-k biztonsági beállitásai XML-bőlEJB-k biztonsági beállitásai XML-ből
Az Enterprise JavaBeans 3.1 EJB31 / 28
Az Enterprise JavaBeans 3.1 EJB31 / 29
Elnevezési konvencióElnevezési konvenció
Szokásos az alábbi elnevezési konvenció használata
Item Syntax ExampleEnterprise bean name <name>Bean AccountBean
Enterprise bean class <name>Bean AccountBean
Üzleti interface <name> Account
Az Enterprise JavaBeans 3.1 EJB31 / 30
Statefull session bean életciklusaStatefull session bean életciklusa
A callback metódusok annotációkkal jelölhetők ki.
Az Enterprise JavaBeans 3.1 EJB31 / 31
Állapotmentes session bean életciklusaÁllapotmentes session bean életciklusa
A callback metódusok annotációkkal jelölhetők ki.
Az Enterprise JavaBeans 3.1 EJB31 / 32
Singleton session bean életciklusaSingleton session bean életciklusa
A callback metódusok annotációkkal jelölhetők ki.
Az Enterprise JavaBeans 3.1 EJB31 / 33
A message-driven bean életcilusaA message-driven bean életcilusa
Az EJB konténer általában példányok pool-ját hozza létre.
Minden példányra az alábbi életciklust alkalmazza:
session Bean használata JSP-bensession Bean használata JSP-ben
EL kifejezéskéntA default EL neve az osztály neve, de az első betű kicsi.
Ha más nevet szeretnénk, akkor használjuk a @Named annotációt.
Context.lookup metódus hívással.
Az Enterprise JavaBeans 3.1 EJB31 / 34
SessionBeanSessionBean interfész (opcionális) interfész (opcionális)
régi verzióknál kötelező volt implementálni.
4 metódus: setSessionContext,
ejbRemove,
ejbPassivate,
ejbActivate
Az Enterprise JavaBeans 3.1 EJB31 / 35
session EJB használata távolrólsession EJB használata távolról
Érdemes a remote interfészeket külön csomagba rakni
Netbeans nem is engedi máshogy.
Az Enterprise JavaBeans 3.1 EJB31 / 36
Netbeans EJB támogatásNetbeans EJB támogatás
Az Enterprise JavaBeans 3.1 EJB31 / 37
Session EJB használata távolrólSession EJB használata távolról// Access JNDI Initial
Context. Properties p = new Properties(); p.put("java.naming.factory.initial","org.jnp.interfaces.NamingContextFactory");
p.put("java.naming.provider.url","jnp://localhost:1099"); p.put("java.naming.factory.url.pkgs","org.jboss.naming:org.jnp.interfaces");
InitialContext ctx = new InitialContext(p); // Change jndi name according to your server and ejb
HelloRemote remote = (HelloRemote) ctx.lookup("HelloBean/remote");
msg = "Message From EJB --> " + remote.sayHello();
http://srikanthtechnologies.com/articles/j2ee/ejb3fromswing.html
Az Enterprise JavaBeans 3.1 EJB31 / 38
Üzenetvezérelt beanÜzenetvezérelt bean
Az Enterprise JavaBeans 3.1 EJB31 / 39
üzenet vezérelt bean használataüzenet vezérelt bean használata@Resource Queue stockInfoQueue;
Context initialContext = new InitialContext();
Queue stockInfoQueue = (javax.jms.Queue)initialContext.lookup
(“java:comp/env/jms/stockInfoQueue”);
queueConnection = queueConnectionFactory.createQueueConnection(); queueSession = queueConnection.createQueueSession(false, Session.AUTO_ACKNOWLEDGE); queueSender = queueSession.createSender(queue);
message = queueSession.createTextMessage();
message.setText("This is message ");
queueSender.send(message);
Az Enterprise JavaBeans 3.1 EJB31 / 40
JNDI JNDI ((Java Naming and Directory Interface))
Bármilyen java alkalmazásban használhatjuk.
Itt ezt használjuk: java:comp/env
Hasonló mint a DNS, vagy LDAP
pl.: java:comp/env/com.example.MySessionBean/myDatabase
Bármilyen lehet a felépítése, de konvenciók vannak.
elérési út -> objektum összerendelés (binding).
nevek séma alapján: scheme : scheme-specific-parts (pl.: ldap: vagy java, ORB, …)
Érdemes egyedi nevet használni!
java:comp/env/com.acme.example.MySessionBean/myDatabase
A webapp, EJB konténerek olvassák, írják. Általában van grafikus felület.
Az Enterprise JavaBeans 3.1 EJB31 / 41
Elnevezési konvenciókElnevezési konvenciók
java:comp
java:app: ugyanabból az appból
java:module: ugyanabból a modulból
java:global
Az Enterprise JavaBeans 3.1 EJB31 / 42
Elnevezési konvenciókElnevezési konvenciók
Saját EJB, adatok: java:comp/env/teljes_nev/adattag
java:comp/env/mail,
java:comp/env/jms,
java:comp/env/persistence,
java:comp/UserTransaction,
java:comp/ORB,
java:comp/TimerService,
java:comp/EJBContextAz Enterprise JavaBeans 3.1 EJB31 / 43
Elnevezési konvenciók remote EJB-reElnevezési konvenciók remote EJB-re
• java:global[/<app-name>]/<module-name>/<bean-name>• app-name akkor van, ha ear file-ban volt.
• XXX.ear esetén XXX
• vagy <app-name> elem az application.xml file-ból.
module-name • annak a modulnak a neve, ahol az ejb van vagy
• <module-name> elem a ejb-jar.xml-nak.
bean-name:
• osztály neve,
• vagy az annotáció name atribútuma
• vagy a <ejb-name> eleme a ejb-jar.xml.
• glassfish kiírja a szerver log-ba.
Az Enterprise JavaBeans 3.1 EJB31 / 44
JNDI architektúraJNDI architektúra
Az Enterprise JavaBeans 3.1 EJB31 / 45
InjekcióInjekció
• Az EJB konténer végzi.• Miután létrehozta bean-t, de mielőtt az üzleti metódust
kiszolgálná.• JNDI-ben keres : java:comp/env/ejb vagy ez alatt
@Resource(name="myDB") //type is inferred from variable
public DataSource customerDB;
@Resource public UserTransaction utx;
@Resource SessionContext ctx;
Az Enterprise JavaBeans 3.1 EJB31 / 46
Injekciót használó EJBInjekciót használó EJB
@Stateless public class EmployeeServiceBean
implements EmployeeService {
...
// The maximum number of tax exemptions, configured by Deployer
@Resource int maxExemptions;
Az Enterprise JavaBeans 3.1 EJB31 / 47
JNDI beállítása ejb-jar.xml-bőlJNDI beállítása ejb-jar.xml-ből<enterprise-beans>
<session>
<ejb-name>EmployeeService</ejb-name>
<ejb-class>com.wombat.empl.EmployeeServiceBean</ejb-class>
<env-entry>
<env-entry-name>maxExemptions</env-entry-name>
<env-entry-type>java.lang.Integer</env-entry-type>
<env-entry-value>15</env-entry-value>
</env-entry>
Az Enterprise JavaBeans 3.1 EJB31 / 48
Kiolvasás JNDI-bőlKiolvasás JNDI-ből
// Obtain the enterprise bean’s environment naming context.
Context initCtx = new InitialContext();
Context myEnv = (Context)initCtx.lookup("java:comp/env");
// Obtain the maximum number of tax exemptions
// configured by the Deployer.
Integer maxExemptions =
(Integer)myEnv.lookup(“maxExemptions”);
Az Enterprise JavaBeans 3.1 EJB31 / 49
Elfogók (Interceptor)Elfogók (Interceptor)
Bean-ekeseményeihez
üzleti metódus hívásaihoz
lehet elfogókat rendelni.
• Egy bean-hez több Interceptor is tartozhat
• Egy int. több beanhez is kapcsolódhat.
• Annotációval, vagy telepítő leíróban lehet beállítani.
• @Interceptors a bean osztályra.
• ejb-jar-ban lehet default interc.- okat definiálni.
Az Enterprise JavaBeans 3.1 EJB31 / 50
Üzleti metódus elfogókÜzleti metódus elfogók
Around-Invoke annotáció vagy around-invoke bejegyzés a leíróban.
Az elfogó metódus aláírása: Object <METHOD>(InvocationContext) throws Exception
Bármilyen hozzáférésű lehet.
Ugyanabban a biztonsági és tranzakció környezetben fut, mint maga megfigyelt bean.
Az Enterprise JavaBeans 3.1 EJB31 / 51
Esemény elfogókEsemény elfogók
PostConstruct, PreDestroy, PostActivate, és PrePassivate annotációk.
post-construct, pre-destroy, post-activate, és pre-passivate xml bejegyzések.
Nem tudni, hogy milyen biztonsági és tranzakció környezetben fut.
Metódus aláírása: void <METHOD> (InvocationContext)
Az Enterprise JavaBeans 3.1 EJB31 / 52
Megfigyelő példa osztályMegfigyelő példa osztálypublic class MyInterceptor {
@PostConstruct
public void any-method-name (InvocationContext ctx) {
…
ctx.proceed();
…
}
@PreDestroy
public void any-other-method-name (InvocationContext ctx) {
...
ctx.proceed();
…
}
}
Az Enterprise JavaBeans 3.1 EJB31 / 53
InvocationContextInvocationContext interfész metódusai interfész metódusai
public interface InvocationContext {public Object getTarget();
public Method getMethod();
public Object[] getParameters();
public void setParameters(Object[] params);
public java.util.Map<String, Object> getContextData();
public Object proceed() throws Exception;
}
Az Enterprise JavaBeans 3.1 EJB31 / 54
Elfogó beállítása bean-bőlElfogó beállítása bean-ből
@Stateless
public class MyBean ... {
public void notIntercepted() {}
@Interceptors(org.acme.MyInterceptor.class)
public void someMethod() {
}
@Interceptors(org.acme.MyInterceptor.class)
public void anotherMethod() {
}
}
Az Enterprise JavaBeans 3.1 EJB31 / 55
Interceptor az összes metódusraInterceptor az összes metódusra
@Stateless
@Interceptors(org.acme.AnotherInterceptor.class)
public class MyBean ... {
...
@Interceptors(org.acme.MyInterceptor.class)
@ExcludeClassInterceptors
public void someMethod() {
}
}Az Enterprise JavaBeans 3.1 EJB31 / 56
Az Enterprise JavaBeans 3.1 EJB31 / 57
IrodalomIrodalom
The J2EE Tutorial
Enterprise JavaBeans Technology Fundamentals Short Course
Braun Tamás: Internet banki alkalmazás fejlesztése J2EE technológiával és az IBM Websphere alkalmazás szerverrelDiplomaterv, Általános Informatikai Tanszék, Miskolc, 2002.