键入

时间:2019-06-27 07:59:55

标签: scala akka

我试图弄清楚ask pattern的工作方式。在文档中说:

  

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

     

交互有一个超时(以避免资源泄漏)。如果   没有任何回应的超时点击将作为   失败(java.util.concurrent.TimeoutException)到mapResponse   功能(这是将失败传递给唯一的“正常”方式   功能)。

     

有关与其他参与者的其他消息传递模式,请参阅   ActorContext#messageAdapter。

     

此方法是线程安全的,可以从除   普通actor消息处理线程,例如   scala.concurrent.Future回调。

有人可以提供一个例子来更好地理解提问模式。

2 个答案:

答案 0 :(得分:2)

当您需要与另一个参与者交互并且还取决于其响应时,可以使用tell方法发送消息并等待新的响应消息(即发即弃)。
由于Akka不能保证交货,因此如果接收方退出,您可能会无限期等待。
Ask返回一个Future [Response],如果在指定的超时时间内没有响应,则该Future将成功完成响应,或者失败并发生TimeoutException。
请参阅example

答案 1 :(得分:1)

在参与者外部的代码中使用“询问模式”与参与者进行通信。 Akka将在幕后为您创建一个演员,发送消息并等待超时后回复。这些都不会阻塞您的线程,因为Future结果将立即返回,并且预期稍后会包含响应。这是必需的,因为角色只能通过发送消息进行通信,如果您不在角色中,则您不会收到消息。建议使用'tell'!而不是'ask'?,因为它效率更高,但有时别无选择,因此您必须将两个世界与'ask'桥接起来。

在互联网上查找示例,或尝试通过main方法调用演员来感受一下。