2012-01-26 4 views
1

액터와 함께 작업 할 때 액터가 요청을 수행하기 위해 여러 액터와 협력해야한다면 여기에서 권장되는 접근 방법은 무엇입니까? 보다 정확하게 말하면, 액터 A (처리 메시지 M을 통해)가 액터 B + 액터 C로부터 정보를 검색해야한다면, 액터 B + C에 비동기 적으로 메시지를 보낼 수 있지만 액터 B + C의 응답을 어떻게 상관시킬 것인가? 원래 메시지 M?액터를 사용하여 여러 메시지 보내기 + 처리

Akka 프레임 워크를 살펴본 결과이 작업이 어떻게 수행되는지 알 수 없으므로 액터는 어떤 메시지가 전송되었는지 추적하고 소스 메시지에 응답을 다시 연결하려고 시도합니다. . 이 유형의 동작이 다양한 액터 프레임 워크에 이미 내장되어 있다고 생각했기 때문에 무언가를 놓쳐 버렸을 것입니다.

답변

1

새 액터를 만들고이를 사용하여 컨텍스트를 보존하고 시간 초과 또는 "조인"을 수행 한 후에 컨텍스트를 중지하십시오. 데이터 흐름

class A extends Actor { 
    def receive = { 
    case DoX(x) => 
     val b = actorB ? DoYourPartOf(x) mapTo manifest[BResult] 
     val c = actorC ? DoYourPartOf(x) mapTo manifest[CResult] 
     b zip c map { case (b,c) => merge(b,c) } pipeTo sender 
    } 
    } 
} 

또는 : 당신은 대신 배우를 산란의 미래 구성을 사용할 수 있습니다

class A extends Actor { 
    def receive = { 
    case DoX(x) => flow { 
     val b = actorB ? DoYourPartOf(x) mapTo manifest[BResult] 
     val c = actorC ? DoYourPartOf(x) mapTo manifest[CResult] 
     merge(b(),c()) 
     } pipeTo sender 
    } 
    } 
} 
1

일반적으로 메시지를 보내고 상관 관계가있는 응답을 받으면 어떤 종류 응답자가 답장과 함께 반환해야하는 원본 메시지의 nonce를 명시적일 수도 있고 메시징 계층에서 지원 될 수도 있습니다. Akka에 대한 확신은 없지만 Erlang이 OTP에서 RPC를 처리하는 방법입니다.

관련 문제