Scala:条件参与者链接



我有两个演员A和B。 控制器向参与者 A 发送请求。现在演员 A 返回类型Try[AbcResponse]的响应。AbcResponse在这里是一个案例类。 基于某些逻辑的参与者 A 可能会直接返回此响应,或者它可能使用 ask 有条件地调用另一个参与者 B。在操作来自 B 的响应后,它会将类型Try[AbcResponse]的响应发送到控制器。

那么我应该在我的演员A中做些什么来处理这种情况。我不想在我的演员 A 中放置等待,因为这会浪费线程池并导致系统变慢。我怎样才能有效地处理这个问题?

您可以将消息中的发送方引用传递给参与者 B,并将参与者 B 的响应pipeself。显然,演员B在其响应中必须将此引用传回演员A。

import akka.pattern.{ask, pipe}
case class MsgToActorB(..., target: ActorRef)
case class ResponseFromActorB(..., target: ActorRef)
class ActorA extends Actor {
def receive = {
case r: Request =>
val s = sender
implicit val timeout = Timeout(5 seconds)
// do something with the request
if (someCondition)
s ! Try(AbcResponse(...))
else
(actorB ? MsgToActorB(..., s)).mapTo[ResponseFromActorB].pipeTo(self)
case ResponseFromActorB(..., target) =>
// do something with the response from B and send a response to the original sender
target ! Try(AbcResponse(...))
}
}

虽然上述方法是安全的,但不使用如下所示ask会更简单。如果必须使用ask并且执行组件 B 在处理来自执行组件 A 的消息时阻塞,请考虑按此处所述配置单独的调度程序。

def receive = {
case r: Request =>
val s = sender
// do something with the request
if (someCondition)
s ! Try(AbcResponse(...))
else
actorB ! MsgToActorB(..., s)
case ResponseFromActorB(..., target) =>
// do something with the response from B and send a response to the original sender
target ! Try(AbcResponse(...))
}

最新更新