2016-11-28 5 views
2

Akka/Play를 기반으로 클러스터 응용 프로그램을 개발 중이며 프런트 엔드 노드가 클러스터에 의해 격리 될 수 있습니다. 이 경우 다시 시작하고 클러스터에 다시 참여할 수 있도록 Play 응용 프로그램을 종료하고 싶습니다.DefaultApplicationLifecycle.stop을 호출 할 때 Play Framework 응용 프로그램이 중단되지 않습니다.

정상적으로 재생 응용 프로그램을 중지하는 올바른 방법은 ApplicationLifecycle을 사용하는 것이 었습니다. 종속성 주입을 사용하여 DefaultApplicationLifecycle 개체를 얻고 ThisActorSystemQuarantinedEvent이 발생할 때마다 defaultApplicationLifecycle.stop()을 호출합니다.

내 문제는 응용 프로그램이 여전히 실행되고 HTTP 포트에서 수신 대기하는 이상한 상태로 끝나지만 거의 아무것도 작동하지 않는 것입니다 (모든 액터는 죽은 것처럼 보입니다). 내 응용 프로그램에 stopHook을 정의하는 동안 Future이 완료되지 않은 것처럼 보입니다. 어떤 시점에서 System.exit()에 전화해야합니까?

+0

'DefaultApplicationLifecycle # stop'처럼 모든 중지 후크가 실행됩니다. 스스로 실제 프로세스를 처리해야합니다. 미래가 결코 끝나지 않는다면 어떤 이유에서든 중지 이유 중 하나가 완료되지 않았기 때문일 수 있습니다 (아무 것도 추가되지 않았기 때문에가 아니라). –

답변

1

ApplicationLifecycle은 응용 프로그램이 중지 될 때 실행되는 후크를 등록하는 데 사용됩니다. 그러나 응용 프로그램을 중지하는 데 사용되지 않아야합니다. docs :

재생 중단주기 이벤트에 연결하는 데 사용됩니다. 응용 프로그램들이이 등록 된 경우에서 반대 방향으로, 종료 될 때

...

정지 후크가 실행됩니다. 이러한 역순 정렬로 인해 구성 요소는 종료 이벤트를 수신하지 않는 한 의존하는 구성 요소를 사용하는 것이 안전하다는 것을 알 수 있습니다.

정말 원하는 것은 Application 인스턴스입니다. Application.stop docs :

응용 프로그램을 중지하십시오. 반환 된 미래는 모든 중지 후크가 실행될 때 사용됩니다. Application.stop가 호출 될 때, 모든 후크 ApplicationLifecycle에 등록

은 "가 등록되었을 때부터 역방향"으로 실행된다. 당신은 너무 의존성 삽입 (Dependency Injection)를 사용하여 Application 인스턴스를 얻을 수 있습니다 :

class SomeClass @Inject() (app: Application) { 
    def somethingHappensThatRequireApplicationToStop() = app.stop() 
} 

그냥 Server을 응용 프로그램을 중지하지만 때문에 여전히 요청을 수신 할 수 있습니다. 아니 완전히 확실하지만, 난 당신이 위의 응용 프로그램을 주입 다만 방법을 주입 할 수 있다고 생각 :

: 그것은 서버가 앱 정지를 강제로 정지하기 때문에, 또한

import play.core.server.Server 

class SomeClass @Inject() (app: Application, server: Server) { 
    def somethingHappensThatRequireApplicationToStop() = { 
     app.stop() 
     server.stop() 
    } 
} 

를, 당신은 다음과 같은 필요

import play.core.server.Server 

class SomeClass @Inject() (server: Server) { 
    def somethingHappensThatRequireToStop() = { 
     server.stop() 
    } 
} 
+0

감사! 왜 내 defaultApplication 라이프 사이클의 미래가 결코 호출되지 않을지 궁금합니다. 네가 제안한 것을 시도 할께, 고마워! – CanardMoussant

+0

사실 나는 똑같은 동작을 보았습니다. 앱은 오래된 상태로 있습니다. 앱이 절대로 멈추지 않는다는 사실을 어떻게 디버그하는지 궁금합니다. – CanardMoussant

+0

질문에 대한 세부 정보가 누락되었습니다.서버를 중지하는 방법에 대한 필자의 편집 내용을 참조하십시오. – marcospereira

관련 문제