我们如何将actor处理过的消息的结果发送给实际的发送者

时间:2016-10-08 22:29:01

标签: scala akka

我创建了一个简单的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日志又说了什么?

1 个答案:

答案 0 :(得分:1)

考虑一下你在做什么:你正在向你的HelloWorld演员发送一条消息,在那里接收并处理它,然后从这个演员发送一条消息给发送原始消息的演员(记住:{ {1}}返回sender)。

但是:那是什么演员?只有一个ActorRef演员。所以自然HelloWorld没有被定义(因为你实际上没有从另一个actor发送消息)。如果您向无法传递的接收者发送消息,他们会转到akkas死信系统actor(sender) - 这就是日志消息所说的内容。

那么你如何实际返回结果呢?您使用 ask-pattern

导入Actor[akka://SimpleActorSystem/deadLetters]并使用问号而不是感叹号来执行此操作。现在你最终会得到一个将来(希望)用你的结果解决的未来:

akka.pattern.ask