[英]Scala: Conditional Actor Chaining
我有兩個演員A和B。一個控制器向演員A發送請求。現在,演員A返回Try[AbcResponse]
類型的響應。 AbcResponse
是這里的案例類。 基於某種邏輯的演員A可能會直接返回此響應,也可能會使用Ask有條件地調用另一個演員B。 在處理了來自B的響應之后,它將把Try[AbcResponse]
類型的響應發送到控制器。
所以我應該在演員A中做什么來處理這種情況。 我不想在演員A中等待,因為那樣會浪費線程池並導致系統變慢。 我如何有效地處理呢?
你可以在一個消息傳遞發送者參照演員B和pipe
從演員B向響應self
。 顯然,演員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(...))
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.