2012-02-01 5 views
5

Estoy construyendo una aplicación web Clojure Noir para ejecutar como un archivo WAR en CloudFoundry.Gancho de inicialización para Clojure Noir WAR/Servlet (CloudFoundry)

En mi project.clj tengo:

:ring {:handler appname.server/handler} 

En server.clj que crear un controlador utilizando Noir:

(def handler (noir.server/gen-handler {:ns 'appname})) 

construyo el archivo WAR utilizando un plugin anillo Lein:

lein ring uberwar 

Luego empuje hacia CloudFoundry usando:

vmc push appname 

El controlador de solicitudes funciona bien y puedo navegar a la URL de la aplicación muy bien.

Entonces la pregunta es: ¿cuál es la forma correcta de hacer la inicialización cuando se inicia la aplicación?

que pueda hacer lo siguiente en server.clj:

(when (System/getenv "VCAP_APPLICATION") 
    (init-func)) 

Pero hay un par de problemas con eso. Primero, parece que está haciendo la inicialización en el momento equivocado (cuando el código se lee/evalúa en lugar de al inicio de la aplicación). En segundo lugar, el protector es específico de CloudFoundry y estoy seguro de que hay una forma general adecuada de WAR para hacer esto.

Creo que este es el propósito del método contextInitialized en el ServletContextListener, pero ¿cómo puedo conectarlo con Noir/ring?

Respuesta

6

pensé que fuera examinado ring source for WAR handling

El project.clj: mapa del círculo toma una palabra clave: init así:

:ring {:init appname.server/my-init 
     :handler appname.server/handler} 

La función mi-init se llamará al iniciar la aplicación.

Advertencia: aparentemente, este dispositivo infla la cantidad de memoria que necesita la aplicación para el inicio inicial. 128M fue suficiente sin la inicialización. Con el código de inicialización, el inicio de la aplicación falló, así que tuve que cambiar la memoria a 256M. Sospecho que con el código de inicio, la JVM no tiene tiempo para recolectar basura antes de compilar/ejecutar el código de Clojure.