我有一个演员(人),我希望能够在状态期间隐藏消息。问题是我不确定如何最好地实现这一目标。
假设我有一些命令。
ChangeAddress
ChangePhoneNumber
BeginMove
FinishMove
Run Code Online (Sandbox Code Playgroud)
当我在移动中间时(在 BeginMove 开始之后和 FinishMove 之前),我想阻止对 Address 和 PhoneNumber 的更新,并在移动完成后重播任何事件。我正在使用 ReceivePersistentActor 并且每个命令都是不同的类。
现在我正在考虑演员上的状态标志,但尽管成为/不成为功能会更自然,但无法看到如何将其应用于不同的命令。
另外作为一个附带问题,是否有一个很好的模式来分解命令和恢复的数量,因为演员需要处理更多的命令/事件?
Akka 已经内置了这个:
http://getakka.net/docs/working-with-actors/Stashing%20Messages
您可以在收到消息时将消息存储在一种状态,然后在您准备转换到相关状态时取消存储。隐藏的消息然后转到邮箱的前面进行处理。
在您的示例中,您将收到一个BeginMove命令并通过调用Become(Moving). 下次处理消息时,您将处于这种新状态。在您的移动方法中,您将配置Receive<ChangeAddress>消息处理程序以存储消息,并将所有其他处理程序配置为在移动时具有您想要的任何行为。在未来的某个时候,您需要一个FinishMove命令来将您的行为改回开始移动之前的状态并取消隐藏所有消息。此时,所有隐藏的消息将开始在您的原始行为状态下进行处理。这都是非阻塞的。
void OriginalState()
{
Receive<ChangeAddress>(s =>
{
// change address logic
});
Receive<BeginMove>(msg =>
{
Become(Moving);
}
}
void Moving()
{
Receive<ChangeAddress>(s =>
{
Stash.Stash();
});
Receive<FinishMove>(msg =>
{
Become(OriginalState);
Stash.UnstashAll();
}
}
Run Code Online (Sandbox Code Playgroud)
有关如何配置状态以处理消息类型的更多示例代码,请参阅可切换行为。
解决问题的一种方法是在适当的情况下将行为委托给子演员,但在那个阶段它更多地成为设计问题。
| 归档时间: |
|
| 查看次数: |
1435 次 |
| 最近记录: |