gpt4 book ai didi

rebus - 如何处理 rebus saga 中的状态转换?

转载 作者:行者123 更新时间:2023-12-04 18:02:35 25 4
gpt4 key购买 nike

假设我有一个 saga 数据,其中包含具有以下值之一的状态:

JustWaiting, AwatingPrepareDrink, WaitingForPayment

我也有不同的消息要处理,但只想在状态具有特定值时处理它们。

即:仅当状态为 AwaitingPrepareDrink 时才处理 PrepareDrinkMessage

为了实现这一目标,我目前正在做类似的事情:

public async Task Handle(PrepareDrinkMessage message)
{
if(Data.CurrentState != BaristaSagaData.State.AwatingPrepareDrink)
{
return;
}

//do some stuff...


//state transition
Data.CurrentState = BaristaSagaData.State.WaitingForPayment;
}

我在使用这种方法时遇到的问题是,传入的消息很可能很快就会收到(工作人员目前可能正在另一个处理程序中工作,该处理程序将转换为正确的状态)。

我试着替换这个:

if(Data.CurrentState != BaristaSagaData.State.AwatingPrepareDrink)
{
return;
}

用这个:

if(Data.CurrentState != BaristaSagaData.State.AwatingPrepareDrink)
{
//too soon, try again in 10 seconds
await _bus.defer(TimeSpan.FromSeconds(10), message);
return;
}

然而,这会导致 saga 修订增加,而另一个处理程序正在做一些工作。当另一个处理程序完成时,并发异常发生,因为修订已同时增加。

有没有其他方法可以防止根据状态处理消息?

有没有办法在不影响修订的情况下推迟消息?

感谢您的帮助!

最佳答案

我认为我将它添加到 0.98.12 中是个好主意,几分钟后即可在 NuGet.org 上获得。

现在你可以改变

if (Data.CurrentState != BaristaSagaData.State.AwatingPrepareDrink)
{
//too soon, try again in 10 seconds
await _bus.Defer(TimeSpan.FromSeconds(10), message);
return;
}

进入

if (Data.CurrentState != BaristaSagaData.State.AwatingPrepareDrink)
{
//too soon, try again in 10 seconds
await _bus.Defer(TimeSpan.FromSeconds(10), message);
MarkAsUnchanged();
return;
}

让我知道它是否适合你:)

这将导致加载和更新 saga 数据的管道步骤跳过更新此特定 saga 数据实例。

关于rebus - 如何处理 rebus saga 中的状态转换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32637961/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com