使用Actors发送+处理多条消息

时间:2012-01-26 22:05:02

标签: concurrency akka

与Actors合作时,如果演员需要与多个其他演员合作以完成请求,那么这里推荐的方法是什么?更确切地说,如果Actor A(通过处理消息M)需要从Actor B + Actor C中检索信息,那么它可以异步地向Actor B + C发送消息,但它应该如何将来自Actor B + C的响应关联到原始消息M?

我已经看过Akka框架并且无法看到这是如何完成的,所以必须自己实现一些东西,其中Actor跟踪已发送的消息并尝试将其响应关联回源消息。我必须遗漏一些东西,因为我认为这种行为已经被构建到各种Actor框架中

2 个答案:

答案 0 :(得分:2)

通常,如果您需要发送消息并获得相关响应,则最终必须在原始消息中发送某种nonce,响应者必须返回该消息。这可以是显式的,也可以在消息传递层中得到支持。不确定Akka,但这就是Erlang如何处理OTP中的RPC。

答案 1 :(得分:1)

只需创建一个新的actor并使用它来保留上下文并在超时或执行“join”后停止它。 您还可以使用Future-composition而不是生成actor:

class A extends Actor {
  def receive = {
    case DoX(x) =>
      val b = actorB ? DoYourPartOf(x) mapTo manifest[BResult]
      val c = actorC ? DoYourPartOf(x) mapTo manifest[CResult]
      b zip c map { case (b,c) => merge(b,c) } pipeTo sender
    }
  }
}

或数据流:

class A extends Actor {
  def receive = {
    case DoX(x) => flow {
      val b = actorB ? DoYourPartOf(x) mapTo manifest[BResult]
      val c = actorC ? DoYourPartOf(x) mapTo manifest[CResult]
      merge(b(),c())
      } pipeTo sender
    }
  }
}
相关问题