【问题标题】:Aggregate multiple actor responses?聚合多个参与者的响应?
【发布时间】:2015-11-11 21:51:46
【问题描述】:

我正在尝试为我的应用程序收集健康信息

class HealthMonitor extends Actor with ActorLogging {
  val statusReporter = new StatusReporter
  val versionInfo = context.actorOf(Props[VersionInfo], "versionInfo")
  val memoryInfo = context.actorOf(Props[MemoryInfo], "memoryInfo")

  def receive = LoggingReceive {
    case HealthReportRequest => log.debug("Generating Health Report")
      println("Generating Health Report")
      // todo (harit): should be concurrent calls and collect results
      versionInfo ! VersionInfoRequest
      memoryInfo ! MemoryInfoRequest
  }
}

我需要什么
我需要一种方法来收集来自versionInfomemoryInfo 的响应以及稍后将其他一些信息转换为 1 个响应并将其发送到某处

而我不想要顺序或想要阻止调用,最好的方法是什么?

【问题讨论】:

  • 做一个询问 (?) 而不是一个告诉 (!),每条消息都将在没有阻塞的情况下发送,并且响应将在两个未来。然后,您可以将这两个 future 组合成一个带有 for 理解的响应。

标签: scala akka


【解决方案1】:

我猜你的意思是询问而不是告诉,因为你是 谈论响应,所以代码应该是

def receive = LoggingReceive {
  case HealthReportRequest => log.debug("Generating Health Report")
    println("Generating Health Report")
    versionInfo ? VersionInfoRequest
    memoryInfo ? MemoryInfoRequest
}

然后你可以输入期货。

def receive = LoggingReceive {
  case HealthReportRequest =>
    versionInfo ? VersionInfoRequest mapTo[VersionInfo]
    memoryInfo ? MemoryInfoRequest mapTo[VersionInfo]
}

然后合并

def receive = LoggingReceive {
  case HealthReportRequest =>
    val version = versionInfo ? VersionInfoRequest mapTo[VersionInfo]
    val memory = (memoryInfo ? MemoryInfoRequest mapTo[VersionInfo])
    version.flatMap(v =>
      memory.map(m =>
        fun(v, m)
    ))
}

或通过for(不确定语法)

def receive = LoggingReceive {
  case HealthReportRequest =>
    val version = versionInfo ? VersionInfoRequest mapTo[VersionInfo]
    val memory = (memoryInfo ? MemoryInfoRequest mapTo[VersionInfo])
    for {
      v <- version
      m <- memory
    } yield fun(v, m)
}

【讨论】:

  • 我认为在这种情况下您还希望您的版本和内存请求是并行的。
  • 我的意思是你最后的代码块:一个带有 flatMap 和 Map,一个带有理解。在那里你提出了两个连续的请求。第一个完成时等待的秒数。
  • 你说得对,有建议如何改进吗? Future.sequence 不适用于此处。
  • 除了首先初始化您的请求,将返回的期货分配给一些变量,然后在“for {}”块或通过 map/flatMap 等待它们之外,我不知道任何其他方式。跨度>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-05-23
  • 1970-01-01
  • 1970-01-01
  • 2018-02-06
  • 2021-04-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多