我对Akka还很陌生,并浏览了Akka文档的这个请求-响应示例。
我理解这种模式的工作原理如下:
Dave
通过发送Hal
的协议的消息来询问Hal
- CCD_ 4通过向CCD_
- 不知道
Hal
的协议的Dave
得到适应的响应并重新发送给它自己 - CCD_ 8接收经调整的响应并继续其有效载荷
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
获得响应(您可以为自己安排一条消息来解释超时(。
请注意,这确实将两个演员纠缠在一起。它适用于父参与者将长期任务推迟给子参与者的情况,但在大多数/所有其他情况下,这是一种非常值得怀疑的方法。