加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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终于回复所需的消息.所以没有异步发生.为什么?

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读