akka.net 在演员的特定状态期间隐藏消息

Jos*_*osh 2 akka.net

我有一个演员(人),我希望能够在状态期间隐藏消息。问题是我不确定如何最好地实现这一目标。

假设我有一些命令。

ChangeAddress
ChangePhoneNumber
BeginMove
FinishMove
Run Code Online (Sandbox Code Playgroud)

当我在移动中间时(在 BeginMove 开始之后和 FinishMove 之前),我想阻止对 Address 和 PhoneNumber 的更新,并在移动完成后重播任何事件。我正在使用 ReceivePersistentActor 并且每个命令都是不同的类。

现在我正在考虑演员上的状态标志,但尽管成为/不成为功能会更自然,但无法看到如何将其应用于不同的命令。

另外作为一个附带问题,是否有一个很好的模式来分解命令和恢复的数量,因为演员需要处理更多的命令/事件?

tom*_*dge 5

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)

有关如何配置状态以处理消息类型的更多示例代码,请参阅可切换行为

解决问题的一种方法是在适当的情况下将行为委托给子演员,但在那个阶段它更多地成为设计问题。