2017-04-21 17 views
6

Tôi có ứng dụng HTTP Akka đang chạy và tôi muốn tắt ứng dụng này.Tắt ứng dụng HTTP Akka

Nhấn Ctrl + C trong SBT does not work cho tôi (vỏ của tôi hiện nay là Git Bash dành cho Windows).

Cách được khuyến nghị tắt ứng dụng Akka một cách duyên dáng là gì?

Trả lời

6

Lấy cảm hứng từ this thread, tôi đã thêm một tuyến đường để ứng dụng của tôi mà tắt ứng dụng:

def shutdownRoute: Route = path("shutdown") { 
    Http().shutdownAllConnectionPools() andThen { case _ => system.terminate() } 
    complete("Shutting down app") 
} 

nơi system là của ActorSystem ứng dụng.

Do tuyến đường này, tôi bây giờ có thể tắt ứng dụng của tôi với

curl http://localhost:5000/shutdown 

Edit:

Có khả năng tắt một máy chủ từ xa không phải là một ý tưởng tốt cho mã sản xuất . Trong các ý kiến, Henrik chỉ vào một con đường khác nhau mà tắt máy chủ bằng cách nhấn Nhập trong SBT console:

StdIn.readLine() 
// Unbind from the port and shut down when done 
bindingFuture 
    .flatMap(_.unbind()) 
    .onComplete(_ => system.terminate()) 

Đối với bối cảnh, tôi đặt đoạn mã trên vào cuối máy chủ khởi tạo:

// Gets the host and a port from the configuration 
val host = system.settings.config.getString("http.host") 
val port = system.settings.config.getInt("http.port") 

implicit val materializer = ActorMaterializer() 

// bindAndHandle requires an implicit ExecutionContext 
implicit val ec = system.dispatcher 

import akka.http.scaladsl.server.Directives._ 
val route = path("hi") { 
    complete("How's it going?") 
} 

// Starts the HTTP server 
val bindingFuture: Future[ServerBinding] = Http().bindAndHandle(route, host, port) 

val log = Logging(system.eventStream, "my-application") 

bindingFuture.onComplete { 
    case Success(serverBinding) => 
    log.info(s"Server bound to ${serverBinding.localAddress}") 

    case Failure(ex) => 
    log.error(ex, "Failed to bind to {}:{}!", host, port) 
    system.terminate() 
} 

log.info("Press enter key to stop...") 
// Let the application run until we press the enter key 
StdIn.readLine() 
// Unbind from the port and shut down when done 
bindingFuture 
    .flatMap(_.unbind()) 
    .onComplete(_ => system.terminate()) 
+2

Trong ví dụ này, chúng hiển thị cách tương tự để thoát, sử dụng cùng một lời gọi phương thức, nhưng bằng cách nhấn quay lại thay vì mở kết nối. Có thể thích hợp hơn nếu bạn có quyền truy cập vật lý dễ dàng vào máy đang chạy. http://doc.akka.io/docs/akka-http/current/scala/http/routing-dsl/index.html#minimal-example – Henrik

Các vấn đề liên quan