scala – Akka:正确使用`ask`模式?
发布时间:2020-12-16 09:11:55 所属栏目:安全 来源:网络整理
导读:我正在尝试grok期货,并问akka的模式. 所以,我做两个演员,一个要求另一个演员发回他的消息.那么,根据akka的期货文件,演员应该问(?)的消息,它会给他一个未来的背景.然后演员应该阻止(使用Await)获取未来的结果. 嗯,我从来没有完成我的未来.这是为什么? 代码
我正在尝试grok期货,并问akka的模式.
所以,我做两个演员,一个要求另一个演员发回他的消息.那么,根据akka的期货文件,演员应该问(?)的消息,它会给他一个未来的背景.然后演员应该阻止(使用Await)获取未来的结果. 嗯,我从来没有完成我的未来.这是为什么? 代码是: package head_thrash import akka.actor._ import akka.util.Timeout import scala.concurrent.Await import scala.concurrent.duration._ object Main extends App { val system = ActorSystem("actors") val actor1 = system.actorOf(Props[MyActor],"node_1") val actor2 = system.actorOf(Props[MyActor],"node_2") actor2 ! "ping_other" system.awaitTermination() Console.println("Bye!") } class MyActor extends Actor with ActorLogging { import akka.pattern.ask implicit val timeout = Timeout(100.days) def receive = { case "ping_other" => { val selection = context.actorSelection("../node_1") log.info("Sending ping to node_1") val result = Await.result(selection ? "ping",Duration.Inf) // <-- Blocks here forever! log.info("Got result " + result) } case "ping" => { log.info("Sending back pong!") sender ! "pong" } } } 如果我将Duration.Inf更改为5.sec,则演员等待5秒钟,告诉我的未来是Timeouted(通过抛出TimeoutException),然后其他actor终于回复所需的消息.所以没有异步发生.为什么? (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |