6

重複の可能性:
リング プロジェクトで任意のスタートアップ関数を実行するには?

シンプルなAPIを構築するために、compojureでclojureリングミドルウェアを使用しています。私は戦争としてアプリを頻繁に展開します。

これはうまく機能しますが、アプリの起動時に 1 回限りの初期化コードを実行する方法を検討しています。「lein ring server」を実行すると問題なく動作しますが、戦争として展開すると、最初のリクエストがサーバーにヒットしたとき(つまり遅延)にのみ実行されるようです。(AOTを使用せずに)怠惰にならないようにする方法はありますか?またはリングミドルウェアのライフサイクルにフックするより良い方法はありますか?

4

2 に答える 2

2

lein-ring プラグインで :init param を探していると思います。https://github.com/weavejester/lein-ringからコピー :

:init - A function to be called once before your handler starts. It should take no 
arguments. If you've compiled your Ring application into a war-file, this function will 
be called when your handler servlet is first initialized.
于 2012-06-19T20:48:56.323 に答える
1

ServletContextListenerの実装がニーズに応えます。で自分で実装したくない場合は、 ring-java-servletプロジェクト:gen-classのサーブレット ユーティリティを使用できます。

これを行うには、起動および/またはシャットダウン中に呼び出したい関数を含むファイルを作成します。

(ns my.project.init
  (:require [org.lpetit.ring.servlet.util :as util]))

(defn on-startup [context]
  (do-stuff (util/context-params context)))

(defn on-shutdown [context]
  (do-other-stuff (util/context-params context)))

web.xml次に、次の設定を介してこれを webapp にフックします。

<context-param>
    <param-name>context-init</param-name>
    <param-value>my.project.init/on-startup</param-value>
</context-param>
<context-param>
    <param-name>context-destroy</param-name>
    <param-value>my.project.init/on-shutdown</param-value>
</context-param>
<listener>
    <listener-class>org.lpetit.ring.servlet.RingServletContextListener</listener-class>
</listener>
于 2012-11-16T02:16:05.333 に答える