Обработка события остановки / перезагрузки контейнера - PullRequest
5 голосов
/ 29 января 2012

Есть лифт-приложение, запускающее демон ssh в Boot.scala.Вот в чем проблема: когда я запускаю container:restart / в сеансе sbt, я получаю адрес уже используется исключение.Теперь два вопроса:

  1. Это правильный способ запустить зависимый сервис в Boot.scala?
  2. В любом случае, как можно обработать контейнер: событие остановки?

Ответы [ 2 ]

10 голосов
/ 31 января 2012

Я думаю, что Lift-y способ сделать это с LiftRules.unloadHooks.

Это плохо документировано (AFAIK), но если вы посмотрите в исходном коде Lift, вы увидите, что когда LiftServlet равно destroy() ed, функции, определенные в LiftRules.unloadHooks выполнены.

Вы можете добавить функции к unloadHooks RulesSeq с помощью метода append или prepend, в зависимости от того, в каком порядке вы хотите, чтобы они выполнялись. Итак, в вашем методе bootstrap.liftweb.Boot.boot , вы можете сделать что-то вроде этого:

sshDaemon.start()
LiftRules.unloadHooks.append( () => sshDaemon.stop() )

(Предполагается, что именно так вы начали и остановили своего демона SSH.)

Я не уверен на 100%, что метод LiftServlet.destroy() вызывается при запуске команды container:restart веб-плагина sbt - это определяется плагином и его взаимодействием с Jetty, а не Lift - но container:stop команда обязательно должна сделать свое дело.

4 голосов
/ 30 января 2012

Я не знаком с Lift, но этот совет должен работать для любого веб-приложения на основе сервлетов.

Зарегистрируйте ServletContextListener в своем web.xml и освободите все ресурсы в методе contextDestroyed. (Запуск должен выполняться методом contextCreated.)

Вы можете использовать setAttribute / getAttribute для сохранения и последующего извлечения сервера.

Собираем все это вместе:

import javax.servlet.{ServletContextEvent, ServletContextListener}


final class SshListener extends ServletContextListener{
  val attributeKey = "sshServer"

  def contextInitialized(sce: ServletContextEvent) {
    val server = new Server()
    server.start()
    sce.getServletContext.setAttribute(attributeKey, server)
  }

  def contextDestroyed(sce: ServletContextEvent) {
    Option(sce.getServletContext.getAttribute(attributeKey)).foreach(_.asInstanceOf[Server].stop())
  }
}

class Server {
  def start()
  def stop()
}
...