A Java EE 6 megjelenése számos újdonságot hozott, már itt is volt szó róla, ezek közül egy érdekesség az un. web-profilok létrehozása. Mint EE fejlesztő gyakran megfordult már a fejemben, hogy vajon tényleg mindig szükség van a teljes enterprise környezetre, hogy vajon nem-e ágyúval verébre amit csinálok, hiszen a szolgáltatások tárházának töredék részét használom egy-egy projektben. Az érem másik oldalán viszont mindig ott van az egyszerű fejlesztés, az átlátható logika (amit egy kicsit az architektúra is kikényszerít), valamint az élesen elkülönített szerep-körök. Ezt a problémát gondolták orvosolni az EE 6 fejlesztői a web-profilok segítségével, mégpedig úgy, hogy az alkalmazásunkhoz igazíthatjuk a felhasznált és szállított rétegeket. A szintén újdonságként megjelenő egyszerűsített deployment technológiának köszönhetően, melynek lényege, hogy az ejb-réteg behelyezhető a web-rétegbe megspórolva a két különálló projektre, némi megkötéssel egy web-konténer, is képes futtatni enterprise alkalmazásunkat. Az EJB Lite technológia nem más, mint egy előre csomagolt web-profil, az alábbi kritériumokkal:
- Stateless, Stateful, és Singleton session beaneket használhatunk
- csak lokális EJB hívásokat végezhetünk
- nem támogatja az aszinkron hívásokat
- támogatja a deklaratív és programozott tranzakciókat
A csomag egy annyira "lebutított" profil, hogy használatához web-konténer sem kell, ennek köszönhetően bármely hagyományos alkalmazásunkban használható, mindössze a javax.ebj és glassfish-embedded-static-shell könyvtár-gyüjteményt (jar) kell importálnunk.
import javax.ejb.Stateless; @Stateless public class TestBean { public String test() { return "ok"; } }
import java.util.Properties; import javax.ejb.embeddable.EJBContainer; import javax.naming.Context; import javax.naming.NamingException; public class Main { public static void main(String[] args) throws NamingException { Properties properties = new Properties(); properties.put("org.glassfish.ejb.embedded.glassfish.installation.root", ""); EJBContainer container = EJBContainer.createEJBContainer(properties); Context namingContext = container.getContext(); TestBean testBean = (TestBean) namingContext.lookup("java:global/classes/TestBean"); System.out.println(testBean.test()); } }Az alkalmazást futtatva az alábbi kimenetet kapjuk:
Mar 3, 2010 8:47:28 AM org.glassfish.ejb.embedded.EJBContainerProviderImpl getValidFile SEVERE: ejb.embedded.location_not_exists Mar 3, 2010 8:47:31 AM com.sun.enterprise.v3.server.AppServerStartup run INFO: GlassFish v3 (74.2) startup time : Embedded(2591ms) startup services(492ms) total(3083ms) Mar 3, 2010 8:47:31 AM org.glassfish.admin.mbeanserver.JMXStartupService$JMXConnectorsStarterThread run INFO: JMXStartupService: JMXConnector system is disabled, skipping. Mar 3, 2010 8:47:31 AM com.sun.enterprise.transaction.JavaEETransactionManagerSimplified initDelegates INFO: Using com.sun.enterprise.transaction.jts.JavaEETransactionManagerJTSDelegate as the delegate Mar 3, 2010 8:47:31 AM AppServerStartup run INFO: [Thread[GlassFish Kernel Main Thread,5,main]] started Mar 3, 2010 8:47:32 AM com.sun.appserv.connectors.internal.api.ConnectorsUtil extractRar INFO: could not find RAR [ __ds_jdbc_ra.rar ] in the archive, skipping .rar extraction Mar 3, 2010 8:47:32 AM com.sun.appserv.connectors.internal.api.ConnectorsUtil extractRar INFO: could not find RAR [ __cp_jdbc_ra.rar ] in the archive, skipping .rar extraction Mar 3, 2010 8:47:32 AM com.sun.appserv.connectors.internal.api.ConnectorsUtil extractRar INFO: could not find RAR [ __xa_jdbc_ra.rar ] in the archive, skipping .rar extraction Mar 3, 2010 8:47:32 AM com.sun.appserv.connectors.internal.api.ConnectorsUtil extractRar INFO: could not find RAR [ __dm_jdbc_ra.rar ] in the archive, skipping .rar extraction Mar 3, 2010 8:47:32 AM com.sun.enterprise.security.SecurityLifecycleINFO: security.secmgroff Mar 3, 2010 8:47:32 AM com.sun.enterprise.security.ssl.SSLUtils checkCertificateDates SEVERE: java_security.expired_certificate Mar 3, 2010 8:47:32 AM com.sun.enterprise.security.SecurityLifecycle onInitialization INFO: Security startup service called Mar 3, 2010 8:47:32 AM com.sun.enterprise.security.PolicyLoader loadPolicy INFO: policy.loading Mar 3, 2010 8:47:33 AM com.sun.enterprise.security.auth.realm.Realm doInstantiate INFO: Realm admin-realm of classtype com.sun.enterprise.security.auth.realm.file.FileRealm successfully created. Mar 3, 2010 8:47:33 AM com.sun.enterprise.security.auth.realm.Realm doInstantiate INFO: Realm file of classtype com.sun.enterprise.security.auth.realm.file.FileRealm successfully created. Mar 3, 2010 8:47:33 AM com.sun.enterprise.security.auth.realm.Realm doInstantiate INFO: Realm certificate of classtype com.sun.enterprise.security.auth.realm.certificate.CertificateRealm successfully created. Mar 3, 2010 8:47:33 AM com.sun.enterprise.security.SecurityLifecycle onInitialization INFO: Security service(s) started successfully.... Mar 3, 2010 8:47:33 AM com.sun.ejb.containers.BaseContainer initializeHome INFO: Portable JNDI names for EJB TestBean : [java:global/classes/TestBean, java:global/classes/TestBean!ejblite.TestBean] ok
Bár nem hiszem, hogy a technológia leggyakoribb alkalmazási területét sikerült megragadnom, mégis ezen egyszerű példából kiindulva csak a fejlesztő kreativitásán múlik, hogy milyen környezetbe ágyazva alkalmazza az EJB réteget.
Aki részletesebben szeretne tájékozódni a témában, megteheti Roberto Chinnici blogjában, vagy a TheServerSide portálon. Az egyszerűsített deploymentről ebben a cikkben található részletesebb leírás.
Nincsenek megjegyzések:
Megjegyzés küldése