我创建了一个简单的Actor,它接收来自发件人的消息并处理该消息,并且该处理结果需要发送回发件人。
我尝试通过Actor模型和发件人
实现上述要求演员代码:
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代码:
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)
}
}
我得到了以下输出:
()
[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'.
我期望主对象(ActorApp)中的输出如下:
32
如何将处理后的输出发回给发件人?这个INFO日志又说了什么?
答案 0 :(得分:1)
考虑一下你在做什么:你正在向你的HelloWorld
演员发送一条消息,在那里接收并处理它,然后从这个演员发送一条消息给发送原始消息的演员(记住:{ {1}}返回sender
)。
ActorRef
演员。所以自然HelloWorld
没有被定义(因为你实际上没有从另一个actor发送消息)。如果您向无法传递的接收者发送消息,他们会转到akkas死信系统actor(sender
) - 这就是日志消息所说的内容。
那么你如何实际返回结果呢?您使用 ask-pattern 。
导入Actor[akka://SimpleActorSystem/deadLetters]
并使用问号而不是感叹号来执行此操作。现在你最终会得到一个将来(希望)用你的结果解决的未来:
akka.pattern.ask