我在使用NServiceBus传奇时遇到了竞争条件。
问题是这个 -
我有一个派生自Saga的类,实现了IAmStartedByMessages并在sql server中保存了saga数据。此saga处理传入消息,创建新消息,将其发送到另一台服务器。此服务器处理消息并发回响应。然后将此回复消息作为saga处理的下一阶段处理。我正在使用saga id来配置映射。
当saga数据之前的回复消息已保存到数据库时出现问题。 由于尚未保存传奇数据,因此映射失败并且消息丢失。
为了说明下面的例子,假设我让这些处理程序监听不同的端点,我在SagaData被持久化之前得到了AnotherMessage。 -
public class MySaga : Saga<SagaData>,
IAmStartedByMessages<StartMesssage>
HandleMessage<AnotherMessage>
{
public override void ConfigureHowToFindSaga()
{
ConfigureMapping<AnotherMessage>(s => s.Id, x => x.SagaId);
}
void Handle(StartMessage message)
{
var sendMsg = new SendMessage(){SagaId=this.Data.Id}
bus.Send(sendMsg)
}
void Handle(AnotherMessage message)
{
}
}
public class NextStage : IHandleMessages<SendMessage>
{
void Handle(SendMessage message)
{
var anotherMsg = new AnotherMessage() {SagaId=message.SagaId};
bus.Send(anotherMsg);
}
}
(顺便说一句,我使用的是NServiceBus 2.x(apache许可证版本)
此致
伊利亚斯
答案 0 :(得分:4)
由于saga数据和bus.send的持久化将成为同一事务的一部分,因此我认为没有竞争条件的任何可能性。您是否100%确定在回复到来之前数据未被保留?