Tipp: Globale Parameter mit JNDI auf Tomcat

20. März 2018
von Ulrich Hilger
alle Rechte vorbehalten

 

Einer Webanwendung, die auf Tomcat ausgeführt wird, können mit Hilfe des Java Naming and Directory Interface (JNDI) Parameter übergeben werden. In der Datei [CATALINA_BASE]/conf/context.xml wird dazu ein Eintrag gemacht wie im folgenden Beispiel 

<Environment name="testParam" type="java.lang.String" value="Ein Test-Parameter" override="false" />

Dieser Eintrag lässt sich beispielsweise wie in folgendem Servlet lesen und ausgeben

public class Test extends HttpServlet {

  public static final String JNDI_CTX_NAME = "java:comp/env";
  public static final String PARAM_NAME = "testParam";
  public static final String NOT_FOUND = " nicht gefunden";
  
  @Override
  protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 
    String param = getJNDIParameter(PARAM_NAME);      
    Writer w = resp.getWriter();
    if(param == null) {
      w.write(PARAM_NAME);
      w.write(NOT_FOUND);
    } else {
      w.write(param);
    }
    w.flush();
    w.close();
  }
  
  private String getJNDIParameter(String pname) {
    String param = null;
    try {
      // unseren environment naming context ermitteln
      Context initCtx = new InitialContext();
      Context envCtx = (Context) initCtx.lookup(JNDI_CTX_NAME);
      
      // unseren Parameter lesen
      param = (String) envCtx.lookup(pname);
    } catch (NamingException ex) {
      Logger.getLogger(Test.class.getName()).log(Level.SEVERE, ex.getMessage());
    }
    return param;
  }
}

Der Vorteil eines globalen Eintrags wie oben ist, dass er z.B. die Neuinstallation der App überdauert. Änderungen am Eintrag werden zudem ohne die Erfordernis eines Neustarts wirksam und können gemacht werden während Tomcat läuft.

Die Datei [CATALINA_BASE]/conf/context.xml ist zwar Bestandteil der Tomcat-Installation was z.B. in einem containerisierten Umfeld ein eigenes Image erfordern würde, um eine eigene Variante dieser Datei mit Tomcat anzuwenden. Das ist allerdings ebenso für nahezu jede produktive Tomcat-Instanz nötig, weil nun einmal viele Einstellungen in [CATALINA_BASE]/conf gemacht werden müssen, z.B. auch in server.xml. Es muss also eigentlich immer vom Standard-Paket von Tomcat abgewichen und ein eigenes Image verwendet werden. 

Stattdessen kann der Eintrag übrigens auch in [CATALINA_BASE]/ conf/ Catalina/ localhost/ [contextname].xml gemacht werden. Hier besteht aber die Gefahr, dass bei der Neuinstallation der App der Eintrag überschrieben wird (sollte mal ausprobiert werden...). Dasselbe gilt für Einträge in [CATALINA_BASE]/webapps/[context]/WEB-INF/web.xml sowie [CATALINA_BASE]/webapps/[context]/META-INF/context.xml wo ebenfalls JNDI-Einträge und auch Context Parameter hinterlegt werden können.

Fazit

Mit Hilfe von JNDI lassen sich Apps ohne Eingriff in ihren Code konfigurieren. Mit Tomcat können solche Konfigurationsparameter ohne Erfordernis eines Neustarts im laufenden Betrieb vorgenommen und geändert werden. Ein JNDI-Parameter überdauert die Neuinstallation einer App, wenn er als globaler Parameter in der Konfiguration von Tomcat unter [CATALINA_BASE]/conf hinterlegt wird.