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