让我们假设我有一个包含以下值之一的状态的saga数据:
JustWaiting, AwatingPrepareDrink, WaitingForPayment
我也有不同的消息要处理,但只希望在状态具有特定值时处理它们。
ie。:仅当state为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;
}
让我知道这是否适合你:)
,这会导致加载和更新传奇数据的管道步骤跳过更新这个特定的传奇数据实例。