如何区分actor解约原因

How to distinguish actor termination reason

我的意思是我按照文档中的描述做了所有事情:

Receive<InitTopicMessage>(m =>
{
  parserActor = getParserActor(Context, rootTopicId);
  Context.Watch(parserActor);
}

// ...

Receive<Terminated>(t =>
{
   if(t == parserActor)
   {
       // do some stuff
   }
}

问题是我想做一些事情 只有当解析器 actor 因错误而终止时,而不是因为 ActorSystem 终止。

那么,有什么方法可以区分演员解约的原因吗?

您将因以下两个原因之一收到终止消息:

  1. 远程 actor 已正常终止
  2. 远程进程崩溃或出现网络故障。

你可以用Terminated.AddressTerminated

来区分两者

如果Terminated.AddressTerminated == true那么是崩溃或网络故障。

如果您需要更精确或处理某些错误,那么您需要在远程系统上使用 supervisor strategy(它可以发送适当的消息)。

Akka 完全是关于容错和弹性的,所以你可能问错了问题。如果远程 actor 宕机了,你如何在没有 parseActor 关心的情况下让它恢复?

还有另一种方法可以解决我的问题,以防有人感兴趣。我在终止 ActorSystem 之前发送自定义消息,指示系统关闭,然后 actor 只是更改其行为以忽略 Terminated 消息:

public class SomeActor : ReceiveActor
{
    public SomeActor()
    {
        Become(Working);
    }

    private void Working()
    {
        Receive<ApplicationStopMessage>(m =>
        {
            Become(ShuttingDown);
        });

        Receive<Terminated>(t =>
        {
            // do stuff on 
        });
    }

    private void ShuttingDown()
    {
        ReceiveAny(m =>
        {
            // ignore all messages
        });
    }
}

// somewhere in code
someActor.Tell(new ApplicationStopMessage());
actorSystem.Terminate();

现在我们将仅处理 Terminated 发送失败的 child 消息。

不像使用 Terminated.AddressTerminated 那样明显和清晰,但对我有用