如果 AskTimeout 达到,则关闭 Akka actor

Shutting down Akka actor if AskTimeout reached

假设我正在对 actor 执行 Ask() 超时,如果请求超时,是否有办法让底层 actor 停止处理事情?例如,我不希望主线程/调用者继续并且该参与者仍在处理超时请求

简短的回答是否定的,你不能这样做。

长答案取决于。

例如,您可以通过 Future 将 actor 的工作移动到另一个执行上下文。这将允许您的 actor 对其他消息做出反应,但是 Future 如果 actor 被执行上下文拾取并且没有挂在执行上下文的队列中,则无法取消该 actor 已经启动。

您可以编写一些智能 Future 包装器,在开始工作之前检查 future 是否已取消。但是如果处理已经开始,你唯一能做的就是在执行 future 的线程上调用 interrupt(这意味着你需要以某种方式捕获这个线程)并跳到工作将达到 Object.waitThread.sleep 方法,即唯一可以接收到中断异常的地方。但不能保证这种情况会发生。

不,你不能。您唯一可以对 Actor 做的就是向它发送消息。你不能 'get' 演员以任何其他方式打断它。并且由于在正常情况下,消息的处理顺序是任何后续的“停止处理”消息只会在第一条消息完成后才被处理。

我认为您的问题的解决方案在一定程度上取决于您怀疑演员可能会“超时”响应的原因。

例如,您可能认为 Actor 有时可能会积压消息,我认为最好的解决方案可能是将超时作为消息的一部分。在您的 receiveMessage 处理程序中,您可以在执行实际工作之前检查此“请求到期”时间,如果超时已经过去,则丢弃该消息。