我在使用NServiceBus sagas时遇到了竞争问题。
问题是-
我有一个从Saga派生的类,它实现IAmStartedByMessages并在sql server中持久化saga数据。这个saga处理传入的消息,创建一个新消息,然后将其发送到另一个服务器。此服务器处理消息并发回响应。然后,该回复消息被处理为saga处理的下一阶段。我使用saga ids来配置映射。
当紧接在saga数据被保存到数据库之前的回复消息出现问题。由于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);
}
}(顺便说一句,我使用的是Apache2.x( NServiceBus许可版)。
致以敬意,
伊利亚斯
发布于 2011-06-22 02:10:17
由于saga数据和bus.send的持久化将是同一事务的一部分,因此我看不到竞争条件的任何可能性。您是否100%确定在回复到达之前数据没有被删除?
https://stackoverflow.com/questions/6425811
复制相似问题