570 likes | 693 Views
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
E N D
Enterprise BeansJava EE 6 platformEJB 3.1 Ficsor Lajos, Krizsán Zoltán Általános Informatikai Tanszék Miskolci Egyetem Utolsó módosítás: 2012. 04. 10. Az Enterprise JavaBeans 3.1
Az 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
A kliens és az EJB kapcsolata Az Enterprise JavaBeans 3.1
Az Enterprise Beans fajtái • 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
A session Bean • Egy egyszerű kliens kérést reprezentál a szerveren • Elválasztja a klienst a szerver által végzett bonyolultabb tevékenységektől • Általában egy klienst tud kiszolgálni egyszerre • Ha a kliens terminálódik, a bean is megszűnik • Ha a szerver leáll, a bean elvész • Három fajtája van: • Stateful (állapottal rendelkező) session bean • Stateless (állapot nélküli) session bean • Singleton session bean Az Enterprise JavaBeans 3.1
Stateful 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
Stateless 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
Singleton 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
Stateful 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
Stateless 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
Singleton 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
A Message-Drivenbean (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
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
A Message-Driven bean (folyt.) Legfontosabb tulajdonságai • Egy 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 mentes • Ha egy üzenet érkezik, a konténer meghívja a bean onMessage metódusát. Az Enterprise JavaBeans 3.1
A 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
Session Bean-ek elérése no-interface view • a bean osztály public metódusai • hasonlóan használhatjuk, mintha egy egyszerű objektum lenne, de • nem kell példányosítani • a konténer szolgáltatásai transzparensek a kliens számára business interface • amit a bean osztályának implementálnia kell • több interface-t is implementálhat Az Enterprise JavaBeans 3.1
Elé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ással • Java EE környezeten kívüli kliensek számára Az Enterprise JavaBeans 3.1
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ást • a kliens fajtája – lehet, hogy másik gépen fut • skálázhatóság: a lokális élérésű bean nehezebben telepíthető át • teljesí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 alkalmazzuk • Ha bizonytalanok vagyunk a döntésben, remote elérést válasszunk - rugalmasság Az Enterprise JavaBeans 3.1
Lokális elérés • A kliens ugyanabban az alkalmazásban van • Lehet • web 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
Loká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
Lokális elérésű bean használata Lokális nem interfész nézet • Nem kell new • Osztály neve a típus @EJB ExampleBean exampleBean; vagy ExampleBean exampleBean = (ExampleBean) InitialContext.lookup("java:module/ ExampleBean"); Az Enterprise JavaBeans 3.1
Lokális elérésű bean használata (folyt.) Lokális interfészen keresztül • Nem kell new • Interface neve a típus @EJB BeanInterface exampleBean; vagy BeanInterface exampleBean = (BeanInterface) InitialContext.lookup("java:module/BeanInterface"); Az Enterprise JavaBeans 3.1
remote elérés • A kliens futhat másik gépen / JVM-ben • Lehet lokális is • Lehet • web komponens • alkalmazá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ára • Paraméterek, visszatérési érték érték szerint -Másolat!!! Az Enterprise JavaBeans 3.1
remote 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
remote 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
EJB kiadása • EJB JAR állományokban -> EAR • 3.1-től WAR fájlban • WEB-INF/classes – osztályok • WEB-INF/lib – jar fájlok • Nem kell ejb-jar.xml, ha van helye: a META-INF Az Enterprise JavaBeans 3.1
EJB-k kapcsolatai Az Enterprise JavaBeans 3.1
EJB-k biztonsági beállitásai XML-ből Az Enterprise JavaBeans 3.1
Elnevezési konvenció • Szokásos az alábbi elnevezési konvenció használata Az Enterprise JavaBeans 3.1
Statefull session bean életciklusa • A callback metódusok annotációkkal jelölhetők ki. Az Enterprise JavaBeans 3.1
Állapotmentes session bean életciklusa • A callback metódusok annotációkkal jelölhetők ki. Az Enterprise JavaBeans 3.1
Singleton session bean életciklusa • A callback metódusok annotációkkal jelölhetők ki. Az Enterprise JavaBeans 3.1
A 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: Az Enterprise JavaBeans 3.1
session Bean használata JSP-ben • EL kifejezésként • A 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
SessionBean 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
session 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
Netbeans EJB támogatás Az Enterprise JavaBeans 3.1
Session 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"); InitialContextctx = 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
Üzenetvezérelt bean Az Enterprise JavaBeans 3.1
ü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
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
Elnevezé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
Elnevezé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/EJBContext Az EnterpriseJavaBeans 3.1
Elnevezési konvenciók remoteEJB-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 EnterpriseJavaBeans 3.1
JNDI architektúra Az Enterprise JavaBeans 3.1
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 DataSourcecustomerDB; @Resource public UserTransaction utx; @Resource SessionContext ctx; Az Enterprise JavaBeans 3.1
Injekció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
JNDI 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
Kiolvasá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
Elfogók (Interceptor) • Bean-ek • esemé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 defaultinterc.-okat definiálni. Az Enterprise JavaBeans 3.1