2012-02-01 5 views
0

나는 그것을 이해하고 배우에게 "화재와 잊지"스타일의 메시지를 보낼 수 있습니다! 연산자 또는 "보내기 및 받기 - 미래"스타일? 운영자. 메시지를 통해 전달되는 배우? self.reply를 호출해야합니다. 그렇지 않으면 발신자가 시간 초과 예외를 수신합니다. 반면에, 메시지를 통해 전달되는 배우! 메시지가 다른 액터로부터 전달되지 않으면 self.reply를 가질 수 없습니다.메시지가 전달되면 반환 된 미래가 예상되는지 여부를 Akka 배우가 구별해야합니까?

내 질문은 배우가 컴파일 타임에 호출 여부를 알고 있어야한다는 것입니다. 또는? ??? 또는 self.reply의 필요성을 런타임에 확인할 수 있다면 어떻게 결정할 수 있습니까? 아마도 self.tryReply가 관련되어 있지만 akka 문서는 실패한 회신 시도가 오류 경우임을 암시하는 것처럼 보입니다. 반면 발신자가 액터가 아닌 경우에는 메시지가 전달 된 경우 회신에 실패하는 것이 실제로 오류가 아닙니다. !

편집 :

class ak extends Actor { 
    def receive = { 
    case msg:String => { 
     val response = "Received: " + msg 
     println(response) 
     self.reply(response) 
     response 
    } 
    } 
} 

이 변경 수정 :

package akTest 

import akka.actor.Actor 

object Main1 { 
    val worker = Actor.actorOf[ak].start() 

    def main(args: Array[String]) { 
    val resp = worker ? "Hi" 
    resp.get 
    println(resp) 
    } 
} 

class ak extends Actor { 
    def receive = { 
    case msg:String => { 
     val response = "Received: " + msg 
     println(response) 
     response 
    } 
    } 
} 

Exception in thread "main" akka.dispatch.FutureTimeoutException: Futures timed out after [4995] milliseconds

그래서 나는 배우에 self.reply를 추가 가져옵니다 여기

는 일부 코드입니다 타임 아웃 에러 하지만 불을 보내는 메인 2가 지금 경우 메시지 잊지 :

object Main2 { 
    val worker = Actor.actorOf[ak].start() 

    def main(args: Array[String]) { 
    val resp = worker ! "Hi" 
    println(resp) 
    } 
} 

을, 새로운 오류가 생성됩니다 [ERROR] [2/1/12 2:04 PM] [akka:event-driven:dispatcher:global-1] [LocalActorRef] No sender in scope, can't reply.

가 어떻게 그 응답의 방식 사이의 커플 링을 제거하기 위해 내 배우를 쓸 수 있습니다 보낸 사람의 호출 방법? 나는 배우의 버전을 1 개 갖고 싶지 않습니다! 배우의 두 번째 버전은?

답변

2

는 senderFuture.isDefined 경우에 당신은 내가 모든 Akka 질문을 읽고있다

+2

에 댓글을 올리려면 미래를 가지고 있고 그들은 모두 한 가지 공통점이 있습니다 거의 그들 중 누구도 해결책을 보여 없다합니다. 그것은이 곳의 모든 지점입니다. [BTW, 분명히 문서와 예제가 명확하지 않습니다.] – Rob

+1

문서를 개선하려면 ML에서 수정해야 할 사항을보고하거나 티켓을 직접 열어야합니다. 우선 코드를 작성하지 않습니다. 왜냐하면 우선, 그렇게 할 시간이 없기 때문입니다. 둘째, 컴파일되지 않았기 때문에 쉽게 부실할 수 있습니다. –

+0

음, 일주일 전 내 게시물에서 완벽한 예제를 보았습니다. Viktor : 액터를 사용하는 문서의 모든 예제는 단지 여러 가지 요소를 병렬로 처리 한 다음 리스너에게 콘솔에 메시지를 내 보내고 끝내다. 완전히 쓸모 없어. 유용한 정보는 다음과 같습니다. 액터에게 메시지를 보내는 방법을 보여주고, 다른 액터에게 작업을 보냈는지 확인한 다음 결과를 REST 서비스로 반환하여 다시 보낼 수 있도록합니다. 추가 도움이 필요하면 스프레이 문서를보십시오. 첫 페이지에는 정확히 어떻게 수행되었는지가 나와 있습니다. 다른 한편으로는 ... – Rob