65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 ncqrs 自动重试并发命令

emptyStarIconemptyStarIconemptyStarIconemptyStarIconemptyStarIcon

0/5 (0投票)

2012 年 3 月 7 日

CPOL

1分钟阅读

viewsIcon

7940

如何使用 ncqrs 自动重试并发命令

上一篇帖子中,我展示了 Gregory Young 在我参加的波兰克拉科夫的 DDD CQRS 课程中提到的一些伪代码。 在这门课程中,Greg 向我们明确指出数据库锁定是不必要的。 他向我们展示了一些伪代码,说明如何轻松编写一个合并处理程序来处理所有并发冲突。

在我的当前项目中,基于 ncqrs-framework,我实现了一个更简单的版本,该版本仅在发生 ConcurrencyException 时重试每个命令。 为了实现这一点,您可以轻松地围绕 ncqrs CommandService 构建一个包装器。

public class SafeCommandService : CommandService 
{
    public override void Execute(ICommand command)
    { 
        try
        {
            base.Execute(command);
        }
        catch(ConcurrencyException ex)
        {
            Execute(command);
            //Log retry executed
        }
    }
}

您可以选择在 WCF 服务或任何您想要的地方实现它。 每一个失败的命令都会被重试,直到成功为止。 我用一百个异步 JavaScript 调用进行了测试,这些调用发送了一个非常简单的命令 (PrintLabelCommand)。 我的领域只处理一个 LabelPrintedEvent。 当将这些调用发送到服务器时,我的日志显示平均只有 8 次重试。 在我们的情况下,这是可以接受的。 如果您有更复杂的场景,您可能需要更高级的设置,例如 这篇博文 中显示的伪代码。

我仍在寻找一个更好的类名,因为我认为 SafeCommandExecutor 不是最好的名字。 所以,如果您有更好的建议,请告诉我。 我希望这篇文章对大家有所帮助。 和往常一样,请分享…

如果您改进了我的代码,请告诉我,以便我能从中学习。

© . All rights reserved.