可能重复:
如何在环项目中运行任意启动功能?
我正在使用带有 compojure 的 clojure ring 中间件来构建一个简单的 api。我经常将应用程序部署为战争。
这很好用,但我正在寻找在应用程序启动时运行一次性初始化代码的方法。当我运行“lein ring server”时,它运行得很好——但是,当部署为战争时,它似乎只在第一个请求到达服务器时运行(即懒惰)。有没有办法让它不懒惰(不使用 AOT) - 或者有没有更好的方法来挂钩环中间件生命周期?
可能重复:
如何在环项目中运行任意启动功能?
我正在使用带有 compojure 的 clojure ring 中间件来构建一个简单的 api。我经常将应用程序部署为战争。
这很好用,但我正在寻找在应用程序启动时运行一次性初始化代码的方法。当我运行“lein ring server”时,它运行得很好——但是,当部署为战争时,它似乎只在第一个请求到达服务器时运行(即懒惰)。有没有办法让它不懒惰(不使用 AOT) - 或者有没有更好的方法来挂钩环中间件生命周期?
我认为您正在寻找 :init lein-ring 插件中的参数。从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.
ServletContextListener实现将满足您的需求。如果您不想自己实现一个:gen-class
,可以使用ring-java-servlet项目中的 servlet 实用程序。
为此,请使用您希望在启动和/或关闭期间调用的函数创建一个文件:
(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>