我创建了一个简单的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日志说明了什么?
考虑一下您在做什么:您正在向HelloWorld
演员发送一条消息,在其中进行接收和处理,然后从该演员向发送原始消息的演员发送一条消息(请记住:sender
返回ActorRef
)。
但是:那是什么演员?只有一个HelloWorld
演员。因此自然sender
没有被定义(因为您实际上没有从其他参与者发送消息)。如果您将消息发送给无法传递的接收者,则它们将发送到akkas死信系统参与者(Actor[akka://SimpleActorSystem/deadLetters]
)-这就是日志消息所说的内容。
那么,您实际上如何返回结果呢?您使用ask-pattern。
导入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)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句