Java 超时时停止actor消息处理

Java 超时时停止actor消息处理,java,scala,akka,actor,Java,Scala,Akka,Actor,我使用带超时的ask模式向我的参与者发送消息,这可能需要很长时间来处理。如果超时过期,我想停止处理消息。但是,演员似乎一直在处理消息,我收到了一封死信 当超时过期时,如何阻止参与者处理消息?简单的回答是您不能。一旦它开始处理它,发送杀戮或毒药丸或停止它只会阻止它处理未来的消息。很长的答案是,如果参与者碰巧处于某种循环中,并且正在检查一些可变(并且可能是全局可用的)信号以停止循环,那么也许你可以绕过这个问题,但是这种方法有太多的危险信号,你应该忘了我甚至提到过它。如果长调用恰好是对DB之类的对象的

我使用带超时的ask模式向我的参与者发送消息,这可能需要很长时间来处理。如果超时过期,我想停止处理消息。但是,演员似乎一直在处理消息,我收到了一封死信


当超时过期时,如何阻止参与者处理消息?

简单的回答是您不能。一旦它开始处理它,发送杀戮或毒药丸或停止它只会阻止它处理未来的消息。很长的答案是,如果参与者碰巧处于某种循环中,并且正在检查一些可变(并且可能是全局可用的)信号以停止循环,那么也许你可以绕过这个问题,但是这种方法有太多的危险信号,你应该忘了我甚至提到过它。如果长调用恰好是对DB之类的对象的阻塞io调用,那么就忘了它;在通话结束之前(或者如果幸运的话,通话超时),您将一直处于停滞状态


参与者本身并不知道有人通过
ask
调用它,并且有一个
未来的上游可能会超时。它没有这方面的概念,因此当未来超时时,它无法做出相应的反应。

简而言之,你不能。一旦它开始处理它,发送杀戮或毒药丸或停止它只会阻止它处理未来的消息。很长的答案是,如果参与者碰巧处于某种循环中,并且正在检查一些可变(并且可能是全局可用的)信号以停止循环,那么也许你可以绕过这个问题,但是这种方法有太多的危险信号,你应该忘了我甚至提到过它。如果长调用恰好是对DB之类的对象的阻塞io调用,那么就忘了它;在通话结束之前(或者如果幸运的话,通话超时),您将一直处于停滞状态


参与者本身并不知道有人通过
ask
调用它,并且有一个
未来的上游可能会超时。它对此没有概念,因此当
未来
超时时无法做出相应反应。

是的,长调用实际上是对db的阻塞调用。我想我可以在另一个
Future
中使用超时来包装db调用,并处理超时异常。@vh4x0r,这可能是个好主意。您还应该考虑在<代码>将来的<代码>中包覆代码,在代码<阻塞/<代码>块中,这样执行上下文就知道它是一个阻塞调用并适当地处理它。此外,您可能希望对这些阻塞IO调用使用单独的
ExecutionContext
,以便那里的备份不会对Akka系统的主调度程序产生不利影响。是的,长调用实际上是对db的阻塞调用。我想我可以在另一个
Future
中使用超时来包装db调用,并处理超时异常。@vh4x0r,这可能是个好主意。您还应该考虑在<代码>将来的<代码>中包覆代码,在代码<阻塞/<代码>块中,这样执行上下文就知道它是一个阻塞调用并适当地处理它。此外,您可能希望对这些阻塞IO调用使用单独的
ExecutionContext
,以便那里的备份不会对Akka系统的主调度程序产生不利影响。