Glassfish: Lifecycle-Module nutzen

Der Oracle Glassfish Application Server bietet die Möglichkeit, auf bestimmte Events beim Starten/Stoppen des Servers zu reagieren. Diese Events kann man nutzen, um z.B. die eigene Applikation sauber herunter zu fahren.

LifecycleListener implementieren

package de.ronnyfriedland.glassfish.ctrl;

import java.util.logging.Level;

import com.sun.appserv.server.LifecycleEvent;
import com.sun.appserv.server.LifecycleListener;
import com.sun.appserv.server.ServerLifecycleException;

/**
 * @author Ronny Friedland
 */
public class SampleGlassfishLifecycle implements LifecycleListener {

    private static final java.util.logging.Logger LOG = java.util.logging.Logger
            .getLogger(SampleGlassfishLifecycle .class.getName());

    /**
     * {@inheritDoc}
     * @see com.sun.appserv.server.LifecycleListener#handleEvent(com.sun.appserv.server.LifecycleEvent)
     */
    @Override
    public void handleEvent(final LifecycleEvent event) throws ServerLifecycleException {
        switch (event.getEventType()) {
        case LifecycleEvent.INIT_EVENT:
            LOG.info("INIT_EVENT");
            break;
        case LifecycleEvent.READY_EVENT:
            LOG.info("READY_EVENT");
            break;
        case LifecycleEvent.SHUTDOWN_EVENT:
            LOG.info("SHUTDOWN_EVENT");
            break;
        case LifecycleEvent.STARTUP_EVENT:
            LOG.info("STARTUP_EVENT");
            break;
        case LifecycleEvent.TERMINATION_EVENT:
            LOG.info("TERMINATION_EVENT");
            break;
        default:
            // nothing to do
        }
    }
}

Diese Klasse muss in den Classpath der Glassfish-Domain abgelegt werden, welche standardmäßig /lib oder /lib/classes ist. Es besteht aber auch die Möglichkeit, des Classpath für das Lifecycle-Modul explizit anzugeben und z.B. auf ein deploytes Artefakt im Ordner applications zu verweisen (z.B. ${com.sun.aas.instanceRoot}/applications/....). Der Vorteil der letzten Variante ist, im Lifecycle-Modul auf die eigene Anwendungslogik zugreifen zu können.

Lifecycle Modul erstellen

Das Lifecycle-Modul kann über den asadmin Befehl oder über die grafische Adminkonsole erstellt werden.

create-lifecycle-module [--help] --classname classname
 [--enabled={true|false}] [--target target]
 [--classpath classpath] [--loadorder loadorder]
 [--failurefatal={false|true} ] [--description description]
 [--property (name=value)[:name=value]*]
 module_name

Als classname gibt man die Implementierungsklasse des LifecycleListener an. Für das konkrete Beispiel könnte der Aufruf so ausssehen, wenn die Implementierungsklasse in einem sample.war verpackt in der Domain deployt wurde:

create-lifecycle-module
 --classname de.ronnyfriedland.glassfish.ctrl.SampleGlassfishLifecycle
 --enabled=true
 --classpath ${com.sun.aas.instanceRoot}/applications/sample/classes
SampleLifecycleModul

Nachteil einer solchen Anwendungssteuerung ist natürlich, dass man sich auf den Oracle Glassfish Server als Applicationserver festlegt.