2014-10-13 4 views
3

내가Akka 배우/스칼라 - 여러에 대한 하나는 onSuccess이

A --> B --> C 

배우 A를 같은 akka 배우의 사슬을 요청 차례로 배우 C. 배우 A는 기다릴 필요 '요청'배우 B를 '요청' 배우 C가 처리를 마칠 때까지 B는 기본적으로 B 단지 무엇을지고하는 것은 미래 [모든]입니다 따라서

 { case msgFromA => sender ! C ? msgFromA } 

을 얇은 층이며, C에 메시지를 전달 (요청)보다 더 아무것도하지 않고 A로 다시 미래를 반환합니다.

A는 요청을 처리하는 방법

는 끔찍한 보이는 말을 중첩지도

actorRefFactory.actorOf(Props[A]) ? msgA map { 
     resp => 
      // Type cast Any to Future and use another map to complete processing. 
      resp.asInstanceOf[Future[_]] map { 
      case Success => 
       // Complete processing 
      case Failure(exc) => 
      // Log error 

이 작동 (즉 최종 처리는 배우 C가 처리를 완료 한 경우에만 발생)하지만 불필요한를 사용하고 있습니다. 나는 flatmaps를 사용해 보았지만 제대로 작동하지 못했습니다. 어떤 아이디어가 좋은 :) 감사

을 보이게
+0

번호 액터 C가 데이터베이스를 호출하고 캐시를 업데이트합니다. – mohit

+0

어쩌면 엄지 손가락 규칙을 놓친 것 같습니다. 그러나 이것은 깔끔한 비 배우를 사용하여 이전 구현보다 효과적입니다. 나는 캐스트 형식이 싫지만 제공하는 성능상의 이점으로 인해 함께 살 수 있습니다. – mohit

답변

4

더 적절한 방법 :

A에서 : B에서

val f: Future[MyType] = (B ? msg).mapTo[MyType] 
f onComplete { 
    case Success(res) => // do something 
    case Failure(t) => // do something 
} 

사용 forward : C에서

{ case msgFromA => C forward msgFromA } 

:

// call database 
// update cache 
sender() ! res // actually sends to A 
+0

고맙습니다. 나는 그것을 테스트하고 옳은 대답으로 받아 들일 것이다 :) – mohit

+0

다행 그것 도움 :) –