2012-02-01 11 views
5

CloudFoundryでWARファイルとして実行するClojure Noir Webアプリケーションをビルドします。私project.cljでClojure Noirの初期化フックWAR/Servlet(CloudFoundry)

私が持っている:私はレインリングプラグインを使用してWARファイルをビルド

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

:server.cljで

:ring {:handler appname.server/handler} 

私はノワールを使用してハンドラを作成

lein ring uberwar 

次に、CloudFoundryを押して、

vmc push appname 

リクエストハンドラが正常に動作し、アプリケーションのURLを参照するだけで問題ありません。

問題は次のとおりです。アプリケーションの起動時に初期化を行う正しい方法は何ですか?

私はserver.cljで、次の操作を行うことができます。

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

をしかし、それとのカップルの問題があります。まず、間違った時(コードがapp startではなくevalされたとき)に初期化を行っているようです。第二に、プロテクターはCloudFoundryに固有であり、私は確かにこれを行うための適切な一般的なWARの方法があります。

これはServletContextListenerのcontextInitializedメソッドの目的だと思いますが、どうすればNoir/ringでそれをフックできますか?

答えて

6

はproject.clj ring source for WAR handling

を見て、それを考え出した:リングマップは取りますので、同様のinitキーワード:

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

私-init関数は、アプリケーションの起動時に呼び出されます。

注意::これは最初の起動時にアプリケーションが必要とするメモリ量を明らかに拡大します。 128Mは初期化なしで十分であった。初期化コードでは、アプリケーションの起動に失敗したので、メモリを256Mにバンプする必要がありました。初期のコードでは、Clojureコードをコンパイル/実行する前にJVMにガベージコレクションの時間がないと思われます。