0

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

假设我有一个演员调用了一个永远不会终止的方法(这是一个极端的例子,你可以考虑调用一个有机会在很长一段时间内终止或永远不会终止的方法)。

例如(Java)

public static class InfiniteLoop{
    public static int neverReturns(){
        int x = 0;
        while(true){
        int++;
        }
        return x;
    }
}

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

InfiniteLoop.neverReturns()

演员永远不会终止。

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

(我想了解的是,是否有办法从 akka 系统中的“无限循环”式故障中恢复)

4

1 回答 1

2

在 Akka 中没有办法实现这样的事情。停止演员的所有方法都依赖于向演员发送消息。如果你的actor因为循环而在处理当前消息时卡住了,它永远不会处理告诉它停止的消息。这是 akka actor 模型的基础,邮箱中的消息按顺序处理,我认为您无法找到解决方法。查看这篇文章,了解有关停止/杀死演员的选项:https ://petabridge.com/blog/how-to-stop-an-actor-akkadotnet/ 。您将看到每个方法的停止语义如何变化,但它们都是从向参与者发送消息开始的。

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

于 2017-11-07T19:42:35.920 回答