2012-01-29 18 views
5

A aplikacja lift uruchamia demona ssh w Boot.scala. Tutaj jest problem: kiedy uruchamiam container:restart / w sesji SBT otrzymuję adres alread w użyciu wyjątek. Teraz dwa pytania:Obsługa zdarzenia zatrzymania/przeładowania kontenera

  1. Czy to właściwy sposób na uruchomienie usługi zależnej w Boot.scala?
  2. W każdym razie, jak można obsługiwać pojemnik: zatrzymać wydarzenie?

Odpowiedz

10

myślę drogę Lift-y, aby zrobić to z LiftRules.unloadHooks.

To nie jest dobrze udokumentowane (AFAIK), ale jeśli spojrzeć w kodzie źródłowym Winda, zobaczysz, że gdy jest destroy() ed LiftServlet, funkcje zdefiniowane w LiftRules.unloadHooks są wykonywane.

Możesz dodać funkcje do unloadHooksRulesSeq metodą append lub prepend, w zależności jakiej kolejności chcesz je wykonywane Tak w metodzie bootstrap.liftweb.Boot.boot, można zrobić coś takiego:.

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

(zakładając, że było jak uruchamiane i zatrzymywane demona SSH.)

nie jestem 100% pewna metoda LiftServlet.destroy() zostanie wywołana, gdy prowadzony jest container:restart komenda w SBT web-pluginu - który jest określony przez wtyczkę d interakcji z Jetty, a nie Lift - ale polecenie container:stop powinno zdecydowanie wystarczyć.

4

Nie jestem zaznajomiony z Lift, ale ta rada powinna działać dla każdej aplikacji internetowej opartej na Servlet.

Zarejestruj numer ServletContextListener w swoim web.xml i zwolnij wszystkie zasoby w metodzie contextDestroyed. (Uruchomienie powinno być wykonane w metodzie contextCreated.)

Możesz użyć setAttribute/getAttribute do przechowywania i późniejszego pobierania serwera.

Wyrażając to wszystko razem:

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() 
}