如何区分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 终止。
那么,有什么方法可以区分演员解约的原因吗?
您将因以下两个原因之一收到终止消息:
- 远程 actor 已正常终止
- 远程进程崩溃或出现网络故障。
你可以用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
那样明显和清晰,但对我有用
我的意思是我按照文档中的描述做了所有事情:
Receive<InitTopicMessage>(m =>
{
parserActor = getParserActor(Context, rootTopicId);
Context.Watch(parserActor);
}
// ...
Receive<Terminated>(t =>
{
if(t == parserActor)
{
// do some stuff
}
}
问题是我想做一些事情 只有当解析器 actor 因错误而终止时,而不是因为 ActorSystem 终止。
那么,有什么方法可以区分演员解约的原因吗?
您将因以下两个原因之一收到终止消息:
- 远程 actor 已正常终止
- 远程进程崩溃或出现网络故障。
你可以用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
那样明显和清晰,但对我有用