(免责声明:我不及akka的初学者)
假设我有一个actor调用一个永远不会终止的方法(它是一个极端的例子,你可以考虑调用一个有机会在很长一段时间内终止或永远不会终止的方法。)
例如(Java)
public static class InfiniteLoop{
public static int neverReturns(){
int x = 0;
while(true){
int++;
}
return x;
}
}
现在,如果在处理消息时,演员调用
InfiniteLoop.neverReturns()
演员永远不会终止。
有没有办法在处理邮件时杀死它?如果是,循环会在后台继续吗?
(我试图理解的是,是否有办法从akka系统中的无限循环"风格的故障中恢复)
答案 0 :(得分:2)
在Akka没有办法实现这样的事情。停止actor的所有方法都依赖于向actor发送消息。如果你的actor由于循环而停留在处理当前消息,它将永远不会处理消息告诉它停止。这是akka actor模型的基础,邮箱中的邮件按顺序处理,我不认为你可以找到解决方法。查看本文,了解停止/终止演员的选项:https://petabridge.com/blog/how-to-stop-an-actor-akkadotnet/。您将看到停止的语义如何改变每个方法,但它们都是通过向actor发送消息开始的。
很高兴知道你为什么需要这样的东西,因为你的基本要求可能会以更akka-ish的方式实现。例如,如果演员可以传递给下一条消息,那么潜在的阻止动作可以在未来被包装。