簡體   English   中英

Scala:條件演員鏈接

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM