scala - 请求模式的请求响应
问题描述
我对 Akka 相当陌生,并且浏览了 Akka 文档的这个请求-响应示例。
我理解这种模式的工作原理如下:
Dave
Hal
通过发送Hal
's 协议的消息来询问。Hal
通过向 发送自己协议的消息来回答Dave
。Dave
,谁不知道Hal
的协议得到适应的响应并重新发送给它自己。Dave
接收适应的响应并继续其有效负载。
context.ask(dave, Dave.Request) {
case Failure(exception) => throw exception
case Success(response) => AdaptedResponse(response.payload)
}
但是,如果当场直接Dave
需要,会发生什么?response.payload
这甚至可能吗?
解决方案
在 Akka Typed 中,无法使用context.ask
,尽管我会质疑您为什么特别需要它。
作为替代方案,当您有两个交互的参与者时,您可以在它们之间定义一个联合协议:
object Hal {
sealed trait Command
sealed trait CommandFromDave extends Command {
def replyTo: ActorRef[Dave.ResponseFromHal]
}
case class OpenThePodBayDoorsPlease(override val replyTo: ActorRef[Dave.ResponseFromHal]) extends CommandFromDave
}
object Dave {
sealed trait Command
sealed trait ResponseFromHal extends Command
case class MessageFromHal(msg: String) extends ResponseFromHal
}
然后Dave
就可以了
hal ! Hal.CommandFromDave(context.self)
并直接从那里获得响应Hal
(您可以为自己安排一条消息以解决超时问题)。
请注意,这确实将两个演员纠缠在一起。它适用于诸如父演员将长期运行的任务推迟给子演员的情况,但在大多数/所有其他情况下,这确实是一种值得怀疑的方法。