2011. április 18., hétfő

Konfigurációs paraméterek EJB és web rétegben Glassfish alkalmazásszerveren

Technológiák: Glassfish 3.1, Maven 2.2.1, EJB 3.0 - 3.1, JNDI

A Konfigurációs paraméterek EJB és web rétegben JBoss alkalmazásszerveren postban leírtam, hogyan lehet JBoss-ban konfigurációs paramétereket felvenni, JNDI segítségével. Ebben a postban leírom, hogy történik mindez Glassfish alatt.

Az aktualizált példaprojekt letöltehető. Ahhoz, hogy lefordítsuk, adjuk ki az mvn package parancsot a főkönyvtárban. Ahhoz, hogy a Glassfish-re telepítsük, a earconfig-ear/target könyvtárban előállt earconfig-ear-1.0-SNAPSHOT.ear kell a Glassfish-re telepítenünk. Persze ezt is megoldhatjuk Maven-ből is, ehhez először indítsuk el a Glassfisht. Az earconfig-ear/pom.xml-ben a glassfish3x profile-ban van definiálva a telepítés, ezért ezzel kell indítani, valamint felül kell definiálnunk jópár paramétert (host, port, stb.). Ehhez átírhatjuk a pom.xml-t, de a -D kapcsolót is használhatjuk a paraméterek felülbírálásához. Tehát adjuk ki a mvn -P glassfish3x cargo:deploy parancsot a earconfig-ear könyvtárban. Érdemes megjegyezni, hogy Glasshfish 3.1-ben az adminisztrátori felhasználónév admin, és nincs jelszó megadva. Régebben ez admin/adminadmint volt. Valamint figyelni kell arra, hogy az asadmin-nak biztonsági okból már nem lehet paraméterként átadni a jelszót, hanem fájlból olvassa fel. A Cargo nem enged Glassfish-re fájl másolásos telepítést, kizárólag az asadmin-t hajlandó hívni. Ezért eltesz egy állományt a temp könyvtárban, nálam a "C:\Documents and Settings\vicziani\Local Settings\Temp\cargo" helyen. Volt olyan, hogy hiába frissítettem a jelszót a pom.xml-ben, ez a fájl nem változott, így nem sikerült a telepítést. Megoldásaként csak le kellett törölni ezt az állományt. Még egy trükk. Ha nem állítottuk át a jelszót, hanem üresen hagytuk a Glassfish telepítés után, akkor is meg kell adni a Cargo-nak az üres String-et (<cargo.remote.password>${glassfish.password}</cargo.remote.password>), különben nem sikerül a telepítés. A JBoss-sal ellentétben, itt ha az alkalmazást frissíteni akarjuk, nem elegendő a cargo:deploy parancs, hanem a cargo:redeploy parancs kell, mert a Glassfish jelzi, hogy már van alkalmazás telepítve.

Glassfish-ben a paraméterek, azaz a rendszer paraméterek (system properties) és a JNDI nevek megadása is háromféleképpen történhet: webes adminisztrátori felületen, parancssori adminisztrátori felületen, vagy konfigurációs állományban.

A system property megadása a webes felületen a server menüpontban a Properties/System properties képernyőn lehetséges. Itt menet közben tetszőlegesen is át lehet írni.

Parancssorban is fel lehet venni, és listázni.

C:\Kaffe\glassfish3\glassfish\bin>asadmin create-system-properties \
 earconfig.system.property="Hello System Property!"
Command create-system-properties executed successfully.

C:\Kaffe\glassfish3\glassfish\bin>asadmin list-system-properties
The target server contains following 1 system properties
earconfig.system.property=Hello System Property!
Command list-system-properties executed successfully.

A konfiguráció a \glassfish3\glassfish\domains\domain1\config\domain.xml XML konfigurációs állományba kerül bele.

A JNDI megadása a webes felületen a Resources/JNDI/Custom Resources menüpontban lehetséges. Itt vegyünk fel egy új erőforrást a megfelelő JNDI névvel. Több típus közül is választhatunk. Az értékek megadása un. factory-kkal történik, és a Glassfish tartalmaz pár előre gyártott factory-t: JavaBeanFactory, PropertiesFactory, PrimitiviesAndStringFactory, URLFactory. Amennyiben String-et akarunk felvenni, típusnál a "java.lang.String"-et kell kiválasztani, a Factory Class ilyenkor "org.glassfish.resources.custom.factory.PrimitivesAndStringFactory" lesz, és fel kell venni egy property-t value névvel. Legyen az értéke a "Hello JNDI!".

URL esetén hasonló a helyzet, de a Resource Type java.net.URL és a factory org.glassfish.resources.custom.factory.URLObjectFactory. Itt property-nek a spec-t kell megadni, érték legyen pl. "http://jtechlog.blogspot.com". Properties megadása már érdekesebb. Itt is a Resource Type-nál ki kell választani a java.util.Properties-t (, a factory org.glassfish.resources.custom.factory.PropertiesFactory lesz). Itt a properties-nél megadhatjuk a név és érték párokat is. Amennyiben egy speciálisat adunk meg org.glassfish.resources.custom.factory.PropertiesFactory.fileName néven, az értéknél szereplő properties fájlt fogja betölteni (, szemben a dokumentációval, ami csak fileName-t ír). A fájlnév lehet abszolút, vagy a Glassfish telepítési könyvtárához képest relatív. A properties állományt szerkesztéskor szépen újra is olvassa. Amennyiben a fájlban és a felületen is megadtunk kulcs-érték párokat, a Glassfish összefésüli ezeket. A JBoss-ban definiálható InetAddress típushoz itt nem találtam factory-t.

A JNDI bejegyzések ugyanúgy parancssorból is konfigurálhatóak. A Glassfish egy régebbi verziójában volt webes JNDI browser felület. Ez most egyelőre csak parancssorból elérhető.

C:\Kaffe\glassfish3\bin>asadmin create-custom-resource \
--restype java.lang.String \
--factoryclass org.glassfish.resources.custom.factory.PrimitivesAndStringFactory \
--property value="Hello JNDI!" earconfig/string
Custom Resource earconfig/string created.
Command create-custom-resource executed successfully.

C:\Kaffe\glassfish3\bin>asadmin list-custom-resources
earconfig/url
earconfig/properties
earconfig/string
Command list-custom-resources executed successfully.

Az értékek ugyanúgy a \glassfish3\glassfish\domains\domain1\config\domain.xml XML konfigurációs állományba kerülnek. Akár saját factory osztályokat is használhatunk.

Ezeket elvégezve az alkalmazás a http://localhost:8080/earconfig/ címen érhető el, és a következőt kell kiírnia:

A projekt bemutatja, hogy hogyan lehet Java EE alkalmazásból konfigurációs paramétereket beolvasni.

    * System property EJB rétegben (kulcs: earconfig.system.property): Hello \
System Property!
    * Context lookup (JNDI) EJB rétegben (JNDI nevek: earconfig/string, \
 earconfig/url, earconfig/inetaddress, earconfig/properties): [Hello JNDI!, \
http://jtechlog.blogspot.com, null, {key=value, key2=value2, key1=value1}]
    * System property web rétegben (kulcs: earconfig.system.property): Hello System Property!
    * Context lookup (JNDI) web rétegben (JNDI nevek: earconfig/string, \
 earconfig/url, earconfig/inetaddress, earconfig/properties): [Hello JNDI!, \
http://jtechlog.blogspot.com, null, {key=value, key2=value2, key1=value1}]

2011. április 14., csütörtök

VisualVM Glassfish monitorozás

Technológiák: Java SE 6 Update 23, VisualVM 1.3.2, Glassfish 2.1.1.

A VisualVM egy vizuális felület, mellyel a Java virtuális gépet monitorozhatjuk. Előnye, hogy a JDK-ba is belekerült, pl. a JDK 6 Update 23-ban a VisualVM 1.3.1 verziója szerepel, a jvisualvm parancs kiadásával azonnal ki is próbálhatjuk. Csatlakozhatunk lokális és távoli virtuális gépekhez is, így akár egy teljes hálózat Java alapú rendszereit monitorozhatjuk. Nem csak külön futtatható, de akár a NetBeans vagy Eclipse fejlesztőeszközbe is plugin-ként telepíthető.

A virtuális gépről olyan alap információkat szolgáltat, mint a PID, indított osztály, parancssori paraméterek, Java Home, JVM pontos verziószáma, valamint a rendszerváltozók. Olyan teljesítmény adatokat tudhatunk meg vele, mint a CPU felhasználás, memória felhasználás, betöltött osztályok száma, szálak száma, stb. A CPU esetén külön mutatja az alkalmazás és a GC által felhasznált processzor időt. Meghívhatjuk a GC-t is. Memóriánál külön megtekinthetjük a Heap és a Permgen kihasználtságát is (, ez utóbbiba kerülnek az osztálydefiníciók). Kérhetünk Heap Dump-ot, mely egy pillanatfelvételt készít a memóriáról. Megmondja, hogy melyik osztályból hány objektum került példányosításra, és ezeket meg is nézhetjük a grafikus felület segítségével, de akár OQL nyelven lekérdezéseket is végezhetünk. Szálak esetén valós időben nézhetjük a szálak állapotát. Kérhetünk Thread Dump-ot is, melyből kiderül, hogy melyik szál éppen mit csinál, melyik kódsorban áll.

CPU és memória profiler funkciókkal is rendelkezik. CPU profile esetén megtudhatjuk, hogy a CPU idejének hány százalékát melyik metódusban tölti. Snapshot-okat is kérhetünk, ezeket lementhetjük, és később, vagy akár más gépen is elemezhetjük. Memória profile estén az objektumok számát és területfoglalását figyeli. Itt is kérhetünk snapshot-ot, és ezeket össze is hasonlíthatjuk. Ez egy remek eszköz arra, hogy teszt előtt és után is készítünk egy snapshot-ot, és összehasonlítva azt látjuk, hogy a teszt után mennyivel több objektumunk lett, osztályonként lebontva. A profile azért eléggé megakaszthatja az alkalmazásunkat.

A JConsole bővíthető, plugin-okat lehet hozzá telepíteni. Ezt az alkalmazásból, futás közben is megtehetjük, a Tools/Plugins menüpontban. Érdekes a VisualVM-MBeans plugin, mellyel gyakorlatilag JMX műveleteket tudunk elvégezni. A JMX-ről már írtam a Java monitorozás és menedzsment postban, míg a Tomcat JMX adminisztrációjáról a Tomcat JMX tűzfalon keresztül postban.

Másik érdekes plugin a Visual GC, mely a memóriát memória területekre lebontva monitorozza, külön az Old, Survivor és Eden területeket.

Szintén érdekes a Glassfish plugin, mellyel a Glassfishre érkező HTTP kéréseket tudjuk monitorozni, valamint a telepített web alkalmazásokat, élő sessionök számát, valamint az egyes servleteket is külön-külön. Ehhez azonban a Glassfishen is konfigurálnunk kell. A bal oldali menüben ki kell választani az Application Server menüpontot, ott a Monitor majd Runtime fület választani, majd a Configura Monitoring linkre kell kattintani. Itt a HTTP Service és a Web Container monitorozását kell minimum LOW-ra állítani. Utána nem árt újraindítani a VisualVM-et, a Glassfish-t nem kell. Sajnos csak 2-es Glassfishhel megy, a 3-as sorozattal próbáltam, de nem sikerült.

A VisualVM a NetBeans Platformra épül. Természetesen mi is írhatunk saját plugineket.