我试图弄清楚ask pattern的工作方式。在文档中说:
执行与另一个请求-响应消息的交互 演员,并将消息转换回该演员的协议。
交互有一个超时(以避免资源泄漏)。如果 没有任何回应的超时点击将作为 失败(java.util.concurrent.TimeoutException)到mapResponse 功能(这是将失败传递给唯一的“正常”方式 功能)。
有关与其他参与者的其他消息传递模式,请参阅 ActorContext#messageAdapter。
此方法是线程安全的,可以从除 普通actor消息处理线程,例如 scala.concurrent.Future回调。
有人可以提供一个例子来更好地理解提问模式。
答案 0 :(得分:2)
当您需要与另一个参与者交互并且还取决于其响应时,可以使用tell方法发送消息并等待新的响应消息(即发即弃)。
由于Akka不能保证交货,因此如果接收方退出,您可能会无限期等待。
Ask返回一个Future [Response],如果在指定的超时时间内没有响应,则该Future将成功完成响应,或者失败并发生TimeoutException。
请参阅example
答案 1 :(得分:1)
在参与者外部的代码中使用“询问模式”与参与者进行通信。 Akka将在幕后为您创建一个演员,发送消息并等待超时后回复。这些都不会阻塞您的线程,因为Future
结果将立即返回,并且预期稍后会包含响应。这是必需的,因为角色只能通过发送消息进行通信,如果您不在角色中,则您不会收到消息。建议使用'tell'!
而不是'ask'?
,因为它效率更高,但有时别无选择,因此您必须将两个世界与'ask'桥接起来。
在互联网上查找示例,或尝试通过main
方法调用演员来感受一下。