2012-01-29 21 views
5

A tiene una aplicación de elevación que inicia ssh daemon en Boot.scala. Aquí está el problema: cuando ejecuto container:restart / en la sesión de sbt obtengo Dirección ya en uso excepción. Ahora dos preguntas:Manejo del evento de detención/recarga del contenedor

  1. ¿Es correcto iniciar el servicio dependiente en Boot.scala?
  2. De todos modos, ¿cómo es posible manejar el contenedor: evento de detención?

Respuesta

10

Creo que la forma Ascensor-Y de hacerlo es con LiftRules.unloadHooks.

No está bien documentado (que yo sepa), pero si nos fijamos en el código fuente de elevación, verá que cuando el LiftServlet es destroy() ed, las funciones definidas en LiftRules.unloadHooks se ejecutan.

Se pueden añadir funciones a la unloadHooksRulesSeq con el método append o prepend, dependiendo de qué orden que desee ejecutar en tanto, en el método de bootstrap.liftweb.Boot.boot, es posible hacer algo como esto:.

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

(suponiendo que era la forma en que comenzó y se detuvo a su demonio SSH.)

no estoy 100% seguro de que el método LiftServlet.destroy() se invoca cuando se ejecuta el comando SBT de web-plugin container:restart - que está determinado por el un plugin d su interacción con Jetty, no con Lift, pero el comando container:stop definitivamente debería ser el truco.

4

No estoy familiarizado con Lift, pero este consejo debería funcionar para cualquier aplicación web basada en Servlet.

Registre ServletContextListener en su web.xml, y libere todos los recursos en el método contextDestroyed. (El inicio debe hacerse en el método contextCreated).

Puede usar setAttribute/getAttribute para almacenar y luego recuperar el servidor.

Poniendo todo esto junto:

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