2016-10-08 1 views
0

나는 보낸 사람으로부터 메시지를 받고 그 메시지를 처리하고 처리 된 결과를 보낸 사람에게 다시 보내는 간단한 액터를 만들었습니다. 처리 된 메시지의 결과를 실제 보낸 사람에게 어떻게 보냅니 까?

나는 배우 모델과 보낸 사람을 통해 그 위의 요구 사항을 달성하기 위해 노력

배우 번호 :

() 
[INFO] [10/08/2016 23:21:50.438] [SimpleActorSystem-akka.actor.default-dispatcher-3] [akka://SimpleActorSystem/deadLetters] Message [java.lang.Integer] from Actor[akka://SimpleActorSystem/user/helloworld1#-233096668] to Actor[akka://SimpleActorSystem/deadLetters] was not delivered. [1] dead letters encountered. This logging can be turned off or adjusted with configuration settings 'akka.log-dead-letters' and 'akka.log-dead-letters-during-shutdown'. 
:
import akka.actor.{ActorRef, ActorSystem, Props} 

object ActorApp { 

    def main(args :Array[String]) ={ 

    val system = ActorSystem("SimpleActorSystem") 
    val actorObj1:ActorRef = system.actorOf(Props[HelloWorld],"helloworld1") 
    val res =actorObj1 ! "Hi" 
    println(res) 

    } 

} 

나는 아래의 출력을 가지고 :

import akka.actor.Actor 
import akka.actor.Props 

class HelloWorld extends Actor { 

    var result:Int =0 
    def receive = { 

    case dataStr:String =>result =process(dataStr) 
    sender ! result 

    } 

    def process(str:String):Int ={ 

    str.length +30 
} 
} 

ActorApp 코드

32 

가 어떻게 보낸 사람에게 처리 결과를 다시 다시 보내려면 어떻게합니까 :나는 주요 개체 (ActorApp)에 다음과 같이 출력을 기대하고있다? 또한이 INFO 로그는 무엇을 말합니까?

답변

1

당신이 무슨 일을하는지 생각해 거기를 수신하고 처리, 당신은 당신의 HelloWorld 배우에게 메시지를 보내는 다음 원래 메시지를 보낸 배우이 배우에서 메시지를 보내 (기억 : senderActorRef를 반환).

하지만 어떤 배우가 그런가요? 액터는 HelloWorld입니다. 그래서 실제로 sender은 정의되지 않았습니다 (다른 액터로부터 실제로 메시지를 보내지 않았으므로). 배달 할 수없는 리시버에게 메시지를 보내면 akkas dead-letters 시스템 담당자 (Actor[akka://SimpleActorSystem/deadLetters])로 가서 로그 메시지에 표시됩니다.

결과를 어떻게 실제로 반환합니까? 문의 패턴을 사용합니다.

수입품 akka.pattern.ask 느낌표 대신 물음표를 사용하십시오. 이제 당신은 (잘하면) 당신의 결과로 해결 될 미래가 될 것입니다.

import akka.pattern.ask 
import scala.concurrent.duration._ 

val system = ActorSystem("SimpleActorSystem") 
val actorObj1:ActorRef = system.actorOf(Props[HelloWorld],"helloworld1") 
val resFuture = (actorObj1 ? "Hi").mapTo[Int] 
val res = Await.result(resFuture, 5 seconds) 
println(res) 
+0

그럼 언제, 송신자를 사용해야합니까? 메시지를 다른 다른 액터로 보내는 발신자입니까? –

+1

아니요, '보낸 사람'은 메시지 보낸 사람입니다. '? '를 통해 액터 시스템으로 메시지를 보낼 때마다 akka는 그것을 추적 할만큼 멋지 기 때문에'sender!'를 통해 다시 전송 된 다음 메시지는'Future'를 해결하는 데 사용됩니다. – Reactormonk

관련 문제