HowTo – Glassfish 3.1 – Property Files „OnStartup“

Hallo zusammen,

der Glassfish in der Version 3.1 ist verfügbar und ich möchte mir gerne die Mühe machen, mir das Ganze ein wenig genauer anzuschauen. Für diesen Zweck möchte ich in nächster Zeit einige Mini-HowTos hier veröffentlichen, die es mir erlauben, noch effizienter mit dem AS zu arbeiten.

Ein Use-Case der mich immer schon interessiert hat ist, wie kann ich es schaffen, Property-Files zur Laufzeit über JNDI zur Verfügung zu stellen.

Nehmen wir folgenden Use-Case an:

Wir arbeiten mit dem Glassfish-Server, verwenden aber „unter der Haube“ einige Backend-Systeme die über Webservices zur Verfügung gestellt werden.

Was müssen wir mindestens wissen, damit wir mit diesen Systemen arbeiten können?

  1. Wir brauchen die URL des EndPoints
  2. Wir brauchen evtl. Usernamen und Passwort

Üblicherweise kann man für die tägliche Entwicklung unterscheiden zwischen Produktiv-Systemen und Entwicklungssystemen. Wir müssen also zusätzlich eine Möglichkeit bereitstellen, wie wir umgebungsabhängig einstellen können, gegen welche Systeme wir uns verbinden.

Das MIttel der Wahl wenn ich gefragt werde sind die guten alten Property-Files.

Wie aber stelle ich diese möglichst komfortabel zur Verfügung?

Idealerweise wäre es so, dass ich beim Startup des Application Servers alle Property Files in einem Verzeichnis lade und per JNDI zur Verfügung stelle. Ist noch so einfach realisiertbar? DOCH!

Ich habe hierfür mal ein kleines Projekt aufgesetzt, natürlich alles Open Source und frei verwendbar.

Das Ganze ist gehostet bei GitHub.
Auschecken geht so:

git clone git@github.com:dilgerma/Glassfish-Property-Loader-.git

Hier der passende Source Code:

 


public class PropertyLifeCycleListener implements LifecycleListener {

 @Override
 public void handleEvent(LifecycleEvent event)
 throws ServerLifecycleException {

 if (LifecycleEvent.STARTUP_EVENT == event.getEventType()) {
 // Folder in which property files are located, folder must be
 // located under ${glassfish-domain-directory}/config
 File file = new File("properties");

 if (!file.exists()) {
 // file not available
 return;
 }

 if (!file.isDirectory()) {
 // file is not a directory
 return;
 }

 try {

 InitialContext context = new InitialContext();

 for (File property : file.listFiles()) {

 if (property.isFile()
 && property.getName().endsWith("properties")) {
 // found a property file, loading
 Properties props = new Properties();
 props.load(new FileInputStream(property));
 // binding property file in jndi
 // name example is "properties/myProperty.properties"
 context.rebind("properties/" + property.getName(),
 props);
 }
 }
 } catch (Exception ex) {
 // Logging Exception to console.
 ex.printStackTrace();
 }
 }
 }

}

Der Glassfish AS bietet uns die Möglichkeit, für jeden LifeCycle Event (INIT, STARTUP, READY, TIMEOUT, TERMINATION) einen Hook zu implementieren, in dem wir bestimmte Sachen machen können, beispielsweise Property-Files laden beim Startup.

Die Properties müssten hierfür im ${glassfish-home}/domains/domain1 „config“ Verzeichnis liegen, und hier genau im Verzeichnis „properties“.

Bauen lässt sich das Ganze so:

 mvn clean install -Dglassfish.home=/home/dilgerma/development/appserv/glassfish3.1/glassfish

Das Glassfish-Home Verzeichnis muss man angeben, damit wir die appserv-rt.jar bekommen, um Zugriff auf die APIs des Glassfish zu haben.
Anschliessend kopieren wir das Ganze einfach in das lib Verzeichnis des Glassfish:

cp target/propertyloader-0.1-SNAPSHOT.jar /home/dilgerma/development/appserv/glassfish3.1/glassfish/lib

Natürlich müssen wir dem Server noch sagen, was wir ihm da gerade gegeben haben:

Einfach im Navigationsbaum (Admin-Web-Console, localhost:4848 unter LifeCycleModules) ein neues LifeCycleModule anlegen und hier die zuvor erzeugte LifeCycleListener-Klasse angeben.

Jetzt noch den AS einmal durchstarten.

Ab jetzt kann auf jedes PropertyFile im angegeben Verzeichnis (per Default properties) über folgende Annotation in jedem Servlet etc. zugegriffen werden:

@Resource(name="properties/myProperty")
private Properties myProperty;
Advertisements

Kommentar verfassen

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s