2016-09-13 4 views
1

저는 일부 외부 데이터 스트림에 연결하고 메시지를 파싱하여 애플리케이션 내부로 더 전달하는 하위 "고객"액터를 보유하고 있습니다. 이 "생산자"시스템에는 pub-sub 아키텍처가 있지만 재 연결 후 구독을 복원하지 않습니다. 현재 이러한 구독을 부모 액터에 저장하고 감독자에게 다시 보냅니다.하지만 문제는 자식이 다시 시작되는 동안 데드 레터 대기열로 전달된다는 것입니다. 나는 약간의 지연 후에 부모에게 스케줄링을 시도 할 수 있었지만 이것은 구독 순서를 방해 할 수있다. 이것은 중요하다.Akka 액터에서 "init"메시지를 재전송합니다.

다시 시작하는 동안 이러한 "resubscription"메시지를 자식에게 전달하려면 어떻게합니까?

+0

자녀가 'Backoff.onFailure (...) withSupervisorStrategy (resubscribingStrategy)'와 함께 'BackoffSupervisor'에 의해 관리되는 경우 – fghkngfdx

답변

1

다시 시작 후크 (http://doc.akka.io/docs/akka/snapshot/scala/actors.html#Restart_Hooks) : preRestart 및 postRestart API를 사용할 수 있습니다.

preRestart에있는 자식 배우의 경우, 감독자에게 자식 배우가 다시 시작될 것이라는 사실을 알려야하고 감독자는 메시지 전송을 일시 중지해야합니다.

아동 배우의 postRestart에서 자녀가 사용 가능함을 감독자에게 알리고 감독자가 메시지 보내기를 재개해야합니다.

+0

"다시 시작합니다"라는 메시지를 보내는 하위 메시지와 그 하위 메시지를 보내는 상위 메시지간에 경주가 있습니까? – tariksbl

+0

네,하지만 그것은 올바른 프로토콜을 구현하는 문제입니다. 아이가 이미 이전 메시지가 이미 처리되었음을 인정하지 않으면 부모는 메시지를 자식에게 보내면 안됩니다. –

0

당신은

context.system.eventStream.subscribe(myListenerActorRef, classOf[DeadLetter]) 
... 
def receive = { 
    case DeadLetter(msg, from, to) => 
    //Do my custom stuff here 
} 

, 저장, 죽은 문자에 가입하고 다시 보낼 수 있습니다.

+0

하지만이 경우 두 개의 메시지 "대기열"이 생겨 잠재적으로 주문을 위태롭게 할 수 있습니다 . 죽어가는 화신에 보내지 않고 그 거절을 재 처리하려고 시도하지 않고 배우 시작에 관한 메시지를 일정을 잡을 수있는 방법이 있습니까? – fghkngfdx

+0

가능한 해킹 - 액터를 다시 시작하는 데 'listensDeadletters/listensRegular' 상태가 도입되었습니다. 그러나 더 나은 솔루션은 배우를 모으는 것이므로 재시작하는 것은 해롭지 않습니다. – dveim