3

NServiceBus saga を使用すると、「楽観的同時実行違反」例外が発生します。

私の物語は比較的単純なフローを扱っています。メッセージが到着すると、外部からのリクエストはほとんど行われず、しばらくすると応答が収集されます。

以下に、私の物語の例を示します。

NServiceBus がそのようなフローに対して「楽観的同時実行違反」例外を生成するのは正常な動作ですか?

どういうわけかサガを再設計することを検討する必要がありますか?

class MySaga: SqlSaga<SagaData>, ...
{
    CorrelationPropertyName => nameof(SagaData.UserId);

    public Task Handle(StartSagaMessage message, IMessageHandlerContext context)
    {
        // save a new item id
        Data.Items.Add(message.ItemId);

        // make an external request for the item title
        context.Send<GetItemTitle>(message.ItemId);
        // make an external request for the item description
        context.Send<GetItemDescription>(message.ItemId);

        // gather results after one hour
        RequestTimeout<RequestTimeout>(TimeSpan.FromHours(1));
    }

    // this method sometimes raises "optimistic concurrency violation" exception
    public Task Handle(GetItemTitleResponse message, IMessageHandlerContext context)
    {
        Data.ItemTitles[message.ItemId] = message.ItemTitle;
    }

    // this method sometimes raises "optimistic concurrency violation" exception
    public Task Handle(GetItemDescriptionResponse message, IMessageHandlerContext context)
    {
        Data.ItemDescriptions[message.ItemId] = message.ItemDescription;
    }

    public Task Handle(RequestTimeout state, IMessageHandlerContext context)
    {
       context.Send<ProcessItems>(Data.Items, Data.ItemTitles, Data.ItemDescriptions);
       MarkAsComplete();
    }
}

私は使っている:

  • NServiceBus 6.4.2
  • NServiceBus.RabbitMQ
  • NServiceBus.Persistence.Sql
4

1 に答える 1