Выполнение функции при запуске приложения 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>