2012-02-01 21 views
5

我正在構建一個Clojure Noir Web應用程序,以在CloudFoundry中作爲WAR文件運行。Clojure Noir WAR/Servlet(CloudFoundry)的初始化鉤子

在我project.clj我:

:ring {:handler appname.server/handler} 

在server.clj我創建使用比諾的處理程序:

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

我建立使用雷音環插件WAR文件:

lein ring uberwar 

然後推送到CloudFoundry使用:

vmc push appname 

請求處理程序正常工作,我可以瀏覽到應用程序的URL就好了。

所以問題是:當應用程序啓動時進行初始化的正確方法是什麼?

我可以做server.clj如下:

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

但也有一對夫婦的問題。首先,它似乎是在錯誤的時間進行初始化(當代碼被讀取/評估而不是在應用程序啓動時)。其次,保護者特定於CloudFoundry,並且我確定有一個適當的一般WAR方法來執行此操作。

我認爲這是ServletContextListener的contextInitialized方法的目的,但我如何鉤住Noir/ring?

回答

6

想通了通過看ring source for WAR handling

的project.clj:環地圖需要一個:初始化關鍵字,像這樣:

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

的我的初始化函數將在應用程序啓動時調用。

警告:這顯然會增加應用程序初次啓動所需的內存量。沒有初始化,128M就足夠了。隨着初始化代碼,應用程序啓動失敗,所以我不得不將內存碰到256M。我懷疑在編譯/執行Clojure代碼之前,使用init代碼JVM沒有時間進行垃圾收集。