6

可能重复:
如何在环项目中运行任意启动功能?

我正在使用带有 compojure 的 clojure ring 中间件来构建一个简单的 api。我经常将应用程序部署为战争。

这很好用,但我正在寻找在应用程序启动时运行一次性初始化代码的方法。当我运行“lein ring server”时,它运行得很好——但是,当部署为战争时,它似乎只在第一个请求到达服务器时运行(即懒惰)。有没有办法让它不懒惰(不使用 AOT) - 或者有没有更好的方法来挂钩环中间件生命周期?

4

2 回答 2

2

我认为您正在寻找 :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.
于 2012-06-19T20:48:56.323 回答
1

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>
于 2012-11-16T02:16:05.333 回答