Freitag, 13. März 2015

Scope-Events in CDI 1.1

Wer in einer Java-Webanwendung mitbekommen möchte, wann die Anwendung fertig bereitgestellt ist (z.B. um den Deployment-Timestamp zu ermitteln und anzuzeigen), hat dazu diverse Möglichkeiten. Eine lang verfügbare Lösung ist ein ServletContextListener, seit Java EE 6 kann man auch eine @Singleton-@Startup-EJB verwenden. Mit CDI 1.1 in Java EE 7 haben wir nun eine weitere Variante, ein @Initialized-Event für den Application-Scope (d.h. für den ServletContext):

import javax.inject.Named;
import javax.enterprise.event.Observes;
import javax.enterprise.context.*;

@Named
@ApplicationScoped
public class DeploymentInfoBean {

  private Date deploymentTimestamp;

  public Date getDeploymentTimestamp() {
    return deploymentTimestamp;
  }

  void deploymentFinished(
    @Observes
    @Initialized(ApplicationScoped.class)
    ServletContext context) {

    deploymentTimestamp = new Date();
  }
}

Wer nur am Zeitpunkt interessiert ist und keine Werte aus dem ServletContext benötigt, kann sich als Parameter auch einfach ein Object übergeben lassen und beseitigt damit die Abhängigkeit zu javax.servlet.

Man kann sich nicht nur über die fertige Initialisierung eines Scopes informieren lassen, sondern auch über die Beendigung eines Scopes – und so beispielsweise Anfang und Ende von HTTP-Sessions überwachen:

public class SessionWatcher {

  void sessionCreated(
    @Observes
    @Initialized(SessionScoped.class)
    HttpSession session) {
      ...
  }

  void sessionDestroyed(
    @Observes
    @Destroyed(SessionScoped.class)
    HttpSession session) {
      ...
  }
}