2014-07-25 5 views
5

한 액터 내에서 코드를 실행하는 동안 액터가 아직 살아 있는지 확인해야합니다. 이 방법을 사용하는 것이 좋을지, 아니면 더 좋은 방법이 있습니까?스칼라/아크카 액터가 종료되었는지 확인

if (self != akka.actor.DeadLetter) { 
    // do something 
} 

감사!

수정 ---

모든 입력에 감사드립니다. 다음과 같은 일이 발생합니다. Play를 사용하고 있습니다. 내 액터가 시작되면 들어오는 요청에 대해 시간 초과가 예약됩니다.

Promise.timeout({ 
    Logger.info(s"$self, timeout expired") 
    // do something 
}, timeoutValue) 

때로는 시간 제한이 만료되기 전에 다른 이유로 연기자가 중지됩니다 (예 : 클라이언트의 연결이 끊어짐). 이 경우, 제가 로그에 다음 참조 나의 이해에

Actor[akka://application/deadLetters], timeout expired. 

, 이것은 기본 deadLetters 배우가 코드를 실행하는 것을 의미합니다. 그래서 내 질문은 실제로 : 배우가 종료 된 후에 약속 코드가 실행되는지 확인하는 가장 좋은 방법은 무엇입니까?

답변

0

액터가 죽은 경우 액터 내의 코드가 실행되지 않습니다.

actorSelection과 함께 특정 액터가 사용 가능한지 확인할 수 있으며 결과로 반환되는 메시지를 보낼 수 있습니다 (아무 것도 표시되지 않으면 메시지가 전송되지 않습니다).

ActorContext.actorSelection(<your-actor-name>) ! someMessage 
+0

답변 해 주셔서 감사합니다. 내 질문에 대한 수정 사항을 볼 수 있습니까? 그것은 죽은 배우 코드에 대한 귀하의 발언을 고려하여 더 나은 문제를 설명합니다. – ticofab

+0

안녕하세요 Fabio :) 다른 저자가 제안한 것처럼 그 배우에 대한 postStop으로 뭔가를 시도 할 수 있습니다. 액터가 종료됩니다). 예를 들어 다른 (시청하는) 배우에게 메시지를 보내면 컨텍스트가 변경됩니까? 또는 다른 외부 동기화를 사용하십시오. – Ashalynd

0

나는 당신이 당신의 배우를 볼 수 있다고 생각하고, 당신이 메시지가 나타나면 Terminated 당신은 당신의 배우가 실행되고 있지 않다는 것을 확신합니다.

ActorContext.watch(self) 
+0

이 정보를 사용할 수있는 방법은 배우의 상태를 설정하고 if 문에서 그러한 상태를 확인하는 것입니다. 어쨌든 if 문은 어떤 시점에서 실행됩니다 (Play Promise 타임 아웃에 있음). 차라리 더 깨끗한 방법을 사용하고 싶습니다. – ticofab

+0

배우가 중지되었을 때 알림을받는 기본 방법은 배우가 배우 내부에서 멈추는 사실을 감지하는 데 도움이되지 않습니다. –

+0

정확하게'ActorContext'가 무엇인지 설명해 주시겠습니까? Thanks –

2

당신은 배우의 라이프 사이클을 숙지해야합니다 http://doc.akka.io/docs/akka/2.3.4/scala/actors.html#Actor_Lifecycle

을 당신이 배우가 정지 될 것되기 직전에 호출 될 postStop() 콜백을 구현할 수 있습니다 배우 내부에서. 다른 배우가 배우의 라이프 사이클을 모니터하고 싶다면 DeathWatch를 사용해야합니다 : http://doc.akka.io/docs/akka/2.3.4/scala/actors.html#Lifecycle_Monitoring_aka_DeathWatch

+0

답변 해 주셔서 감사합니다.이 코드는 실제로 DeadLetter 액터에서 실행됩니다. 나는 문맥을 더주기 위해 질문을 편집했다. – ticofab

관련 문제