Выполнение функции при запуске приложения ring/compjure после развертывания

Возможный дубликат:
Как запустить произвольную функцию запуска в кольцевом проекте?

Я использую промежуточное программное обеспечение clojure ring с compojure для создания простого API. Я часто разворачиваю приложение как войну.

Это прекрасно работает, но я ищу способы запуска одного кода инициализации при запуске приложения. Когда я запускаю "сервер lein ring", он работает просто отлично - однако, когда он развернут как война, он запускается только тогда, когда первый запрос попадает на сервер (т.е. ленивый). Есть ли способ сделать его не ленивым (без использования AOT) - или есть лучший способ подключиться к жизненному циклу промежуточного программного обеспечения кольца?

2 ответа

Я думаю, что вы ищете:init param в плагине 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.

Для этого создайте файл с функциями, которые вы хотите вызвать во время запуска и / или выключения:

(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 настройки:

<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>
Другие вопросы по тегам