Akka中的询问模式的示例

  • 本文关键字:模式 Akka scala akka
  • 更新时间 :
  • 英文 :


我正在尝试弄清楚,问候模式如何工作。在文档中,它说:

与另一个请求 - 响应消息交互 演员,然后将消息转换回该演员的协议。

交互具有超时(以避免资源泄漏(。如果是 超时击中没有任何响应,它将通过 失败(java.util.concurrent.TimeOutException(到MapResponse 功能(这是将故障传递给的唯一"正常"方式 功能(。

有关与其他演员的其他消息模式,请参阅 ActorContext#MessageApter。

此方法是线程安全的,可以从其他线程调用 普通演员消息处理线程,例如 scala.concurrent.future回调。

有人可以提供一个示例,以更好地了解询问模式。

'ask模式'在参与者之外的代码中用于与演员进行交流。Akka将在幕后为您创建一个演员,发送消息并在超时内等待回复。这些都不会阻止您的线程,因为Future结果将立即返回,这将在以后包含响应。这是需要的,因为演员只能通过发送消息来交流,如果您不在演员中,您将无法收到消息。建议使用"告诉" !而不是" ask" ?,因为它效率更高,但有时别无选择,因此您必须将两个世界与" ask"一起桥接。

在Internet上寻找示例或尝试从main方法致电演员以了解它。

当您需要与另一个演员互动并取决于其响应时,您可能会使用告诉方法发送消息并等待新的响应消息(fire and-forget(。<<<<<<<<<<br>由于Akka无法保证交付的事实,您可能会无限地等待接收者的演员。
询问返回未来的[响应],如果指定超时没有响应,则可以成功响应完成,或者失败了。
请参阅示例

您提出的问题与Akka键入有关,并且询问模式API与标准(未型(Akka略有不同。

这些示例可以在Akka Docs上找到,并在此处复制

trait CookieCommand {}
case class GiveMeCookies(replyTo: ActorRef[Cookies]) extends CookieCommand
case class Cookies(count: Int)
import akka.actor.typed.scaladsl.AskPattern._
// asking someone requires a timeout and a scheduler, if the timeout hits without response
// the ask is failed with a TimeoutException
implicit val timeout: Timeout = 3.seconds
implicit val scheduler = system.scheduler
val result: Future[Cookies] = cookieActorRef.ask(ref => GiveMeCookies(ref))
// the response callback will be executed on this execution context
implicit val ec = system.executionContext
result.onComplete {
  case Success(cookies) => println("Yay, cookies!")
  case Failure(ex)      => println("Boo! didn't get cookies in time.")
}

最新更新