Java 阿卡:如何关闭一个演员,它';这不是终止

Java 阿卡:如何关闭一个演员,它';这不是终止,java,akka,akka-actor,Java,Akka,Akka Actor,(免责声明:我不是akka的初学者) 假设我让一个参与者调用一个永远不会终止的方法(这是一个极端的例子,您可以考虑调用一个有机会在很长时间内终止或永远不会终止的方法) 例如(Java) 现在,如果在处理消息时,参与者调用 InfiniteLoop.neverReturns() 演员永远不会结束 有没有办法在它仍在处理消息时杀死它?如果是,循环是否会在后台继续 (我试图理解的是,是否有一种方法可以从akka系统中的“无限循环”式故障中恢复)在akka中无法实现这种方法。所有阻止参与者的方法都依赖

(免责声明:我不是akka的初学者)

假设我让一个参与者调用一个永远不会终止的方法(这是一个极端的例子,您可以考虑调用一个有机会在很长时间内终止或永远不会终止的方法)

例如(Java)

现在,如果在处理消息时,参与者调用

InfiniteLoop.neverReturns()
演员永远不会结束

有没有办法在它仍在处理消息时杀死它?如果是,循环是否会在后台继续


(我试图理解的是,是否有一种方法可以从akka系统中的“无限循环”式故障中恢复)

在akka中无法实现这种方法。所有阻止参与者的方法都依赖于向参与者发送消息。如果您的参与者由于循环而无法处理当前消息,它将永远不会处理通知其停止的消息。这是akka actor模型的基础,邮箱中的消息是按顺序处理的,我认为您无法找到解决方法。查看本文以了解有关停止/杀死参与者的选项:。您将看到每个方法的停止语义是如何变化的,但它们都是从向参与者发送消息开始的


很高兴知道你为什么需要这样的东西,因为也许你的基本需求可以用一种更像akka的方式来实现。例如,如果参与者可以传递到下一条消息,那么潜在的阻塞操作可以在将来包装。

在Akka中没有办法实现这样的事情。所有阻止参与者的方法都依赖于向参与者发送消息。如果您的参与者由于循环而无法处理当前消息,它将永远不会处理通知其停止的消息。这是akka actor模型的基础,邮箱中的消息是按顺序处理的,我认为您无法找到解决方法。查看本文以了解有关停止/杀死参与者的选项:。您将看到每个方法的停止语义是如何变化的,但它们都是从向参与者发送消息开始的


很高兴知道你为什么需要这样的东西,因为也许你的基本需求可以用一种更像akka的方式来实现。例如,如果参与者可以传递到下一条消息,那么潜在的阻塞操作可以在将来进行包装。

如果我理解得很好,您的建议是:在将来包装调用,然后在超时调用后取消(true)。这能保证任务的中断吗?实际上我认为这不能保证任务的中断,你必须处理它。我的建议是一个初步的建议,你要看看什么对你有效你可能会从这里得到处理它的想法:不过要小心以后的事情,如果你同时做很多这样的操作,你应该使用一个专门的调度器。在任何情况下,如果您有一个特定的用例,请尝试并发布它,因为可能有其他方法,“强制”停止正在运行的线程在JVM上基本上是不可能可靠的-确实提供了一些良好的背景。如果我理解得很好,您的建议是:在将来结束调用,然后在超时调用后取消(true)关于未来。这能保证任务的中断吗?实际上我认为这不能保证任务的中断,你必须处理它。我的建议是一个初步的建议,你要看看什么对你有效你可能会从这里得到处理它的想法:不过要小心以后的事情,如果你同时做很多这样的操作,你应该使用一个专门的调度器。在任何情况下,如果您有一个特定的用例,请尝试并发布它,因为可能有替代方法,“强制”停止正在运行的线程基本上是不可能在JVM上可靠地完成的-确实提供了一些良好的背景。
InfiniteLoop.neverReturns()