2012-01-29 27 views
5

Có ứng dụng nâng hạ bắt đầu ssh daemon trong Boot.scala. Đây là vấn đề: khi tôi chạy container:restart / trong phiên sbt tôi nhận được Địa chỉ alread sử dụng ngoại lệ. Bây giờ, có hai câu hỏi:Xử lý sự kiện dừng/tải lại vùng chứa

  1. Có đúng cách để bắt đầu dịch vụ phụ thuộc trong Boot.scala không?
  2. Dù sao có thể xử lý vùng chứa: dừng sự kiện?

Trả lời

10

Tôi nghĩ rằng cách Lift-y để làm điều đó là với LiftRules.unloadHooks.

Nó không được ghi chép đầy đủ (AFAIK), nhưng nếu bạn nhìn vào mã nguồn Lift, bạn sẽ thấy rằng khi LiftServletdestroy() ed, các chức năng được xác định trong LiftRules.unloadHooks được thực thi.

Bạn có thể thêm chức năng cho unloadHooksRulesSeq với append hoặc prepend phương pháp, tùy thuộc vào thứ tự những gì bạn muốn họ thực hiện trong Vì vậy, trong phương pháp bootstrap.liftweb.Boot.boot của bạn, bạn có thể làm điều gì đó như thế này:.

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

(Giả sử đó là cách bạn bắt đầu và dừng SSH daemon của bạn.)

Tôi không chắc chắn rằng phương thức LiftServlet.destroy() được gọi khi lệnh sbt web-plugin's container:restart chạy - được xác định bởi plugin d tương tác của nó với Jetty, không phải bằng Lift - nhưng lệnh container:stop chắc chắn sẽ thực hiện thủ thuật.

4

Tôi không quen với Nâng, nhưng lời khuyên này sẽ hoạt động đối với bất kỳ ứng dụng web dựa trên Servlet nào.

Đăng ký ServletContextListener trong web.xml và giải phóng bất kỳ tài nguyên nào theo phương pháp contextDestroyed. (Việc khởi động nên được thực hiện theo phương pháp contextCreated.)

Bạn có thể sử dụng setAttribute/getAttribute để lưu trữ và sau đó truy xuất máy chủ.

Đưa tất cả điều này với nhau:

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() 
} 
Các vấn đề liên quan