首页 > 解决方案 > MassTransit Saga:缺少一些事件来过渡阶段

问题描述

我正在开发 SAGA 状态可以在已确认或未决确认之间切换的交易订单。我发现有时如果我提交超过 10 个 ReplaceOrderAcknowledge 事件。有一个或两个
SAGA 状态可能不会按预期移动到“已确认”。虽然任务 MarkReplaceOrderAcknowledged 被调用并完成。但国家没有动静。或者有时没有消耗事件 ReplaceOrderAcknowledge 并使我的 SAGA 状态始终保持为“PendingAcknowledged”。

我正在使用大众运输 6.3.1。对这个mssing有什么建议吗?

    Initially(
        When(AlgoRequested)
                .ThenAsync(SendMarketDataSubscriberAsync)
                .TransitionTo(MarketDataSubscribed),
        During(MarketDataSubscribed,
            Ignore(AlgoRequested),
            When(MarketDataChanged)
                .Then(MarketDataChangedTask)
                .TransitionTo(PendingAcknowledged));

        During(Acknowledged,
            When(MarketDataChanged)
                .Then(MarketDataChangedTask)
            When(MarketDataChanged, ShouldGrab)
                .ThenAsync(HandleGrabAsync)
                .TransitionTo(PendingAcknowledged),
           When(MarketDataChanged, ExceedTickAwayPrice)
                .ThenAsync(ExceedTickAwayPriceAsync)
            When(MarketDataChanged, ShouldFloatNotGrab)
                .ThenAsync(HandleFloatAsync)
                .TransitionTo(PendingAcknowledged),
            When(MarketDataChanged, context => context.Instance.CancelSubmitted)
                .ThenAsync(HandleCancelRequestAsync))

        During(PendingAcknowledged,
            Ignore(AlgoRequested),
            Ignore(MarketDataChanged),
            When(FloatAwaken)
                .Then(FloatAwakenTask)
                .Then(context => Log.Information("{@AwakenDoNothing}", context.Instance)),
           
           
            When(ReplaceOrderAcknowledge)
                .ThenAsync(MarkReplaceOrderAcknowledge)
                .Then(context => Log.Information("{@ReplaceOrderAcknowledge}", context.Instance))
                .ThenAsync(SendMarketDataRequestedAsync)
                .TransitionTo(Acknowledged),
            ,

添加功能 MarkReplaceOrderAcknowledge

private async Task MarkReplaceOrderAcknowledge(BehaviorContext<FGOrderDetailState, IAlgoReplaceAcknowledged> context)
    {
        if (context.Data.OrderDetail.MsgSequenceNumber > context.Instance.AlgoMsgSequenceNumber)
        {
              context.Instance.MarketDataUsed = false;

            var algoAck = context.Data;
            algoAck.CorrelationId = context.Instance.OriginalCorrelationId;
            await _strategyBus.Publish<IAlgoReplaceAcknowledged>(algoAck);
        }
    }

标签: c#masstransit

解决方案


推荐阅读