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:
[code language=”java”]
git clone git@github.com:dilgerma/Glassfish-Property-Loader-.git
[/code]

Hier der passende Source Code:

 

[code language=”java”]

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();
}
}
}

}

[/code]

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:
[code language=”java”]
mvn clean install -Dglassfish.home=/home/dilgerma/development/appserv/glassfish3.1/glassfish
[/code]

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:
[code language=”java”]
cp target/propertyloader-0.1-SNAPSHOT.jar /home/dilgerma/development/appserv/glassfish3.1/glassfish/lib
[/code]

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:

[code language=”java”]
@Resource(name="properties/myProperty")
private Properties myProperty;
[/code]

Effective Trainings & Consulting - Martin Dilger



Hat Ihnen dieser Blog-Eintrag gefallen? Ich stelle in diesem Blog Informationen über Tools, Frameworks und Werkzeuge zur Verfügung, die mich produktiver machen. Vielleicht kann ich auch Ihnen helfen, produktiver zu werden.


Ich unterstütze Sie als freier Mitarbeiter bei der Entwicklung von Software-Projekten, Agiler Arbeit sowie Schulungen / Fortbildungen.


Jeden Tag ein bisschen produktiver - ab heute