NserviceBus未加载现有saga数据
我已经使用nservice总线saga实现了一个my连接器。下面是代码NserviceBus未加载现有saga数据,nservicebus,saga,Nservicebus,Saga,我已经使用nservice总线saga实现了一个my连接器。下面是代码 public class ClientSaga : Saga<ClientSagaState>, IAmStartedByMessages<ClientChangeMessage>, IAmStartedByMessages<ClientContactChangeMessage>, IAmStartedBy
public class ClientSaga : Saga<ClientSagaState>,
IAmStartedByMessages<ClientChangeMessage>,
IAmStartedByMessages<ClientContactChangeMessage>,
IAmStartedByMessages<ClientPictureChangeMessage>,
IHandleTimeout<ClientSagaState>
{
[SetterProperty]
public IClientContactChangeDb ClientContactChangeDb{get;set;}
[SetterProperty]
public IBusRefTranslator BusRefTranslator{get;set;}
public void Handle(ClientContactChangeMessage message)
{
var state=this.Data;
//Some handling logic
//Check if client is not in database then store the state
state.ClientContactChange=message;
state.ClientRef =message.ClientRef;
//if client is in the data base then
MarkAsComplete();
}
public void Handle(ClientChangeMessage message)
{
var state=this.data;
//Update or create the client depending on the situation
//check for dependencies
if(state.ClientContactChange !=null)
{
//Handle the contact change
}
else
{
state.ClientChangeMessage=message;
state.ClientRef=message.ClientRef;
}
}
public void Handle(ClientPictureChangeMessage message)
{
var state=this.Data;
//If the client is there then update the picture else store in saga
state.ClientPictureChangeMessage =message;
state.ClientRef=message.ClientRef;
}
}
public override void ConfigureHowToFindSaga()
{
ConfigureMapping<ClientContactChangeMessage>(s => s.ClientRef, m => m.ClientRef);
ConfigureMapping<ClientPictureChangeMessage>(s => s.ClientRef, m => m.ClientRef);
ConfigureMapping<ClientChangeMessage>(s => s.ClienttnRef, m => m.Id);
}
}
public class ClientSagaState: IContainSagaData
{
//i dont need these three fields
public Guid Id { get; set; }
public string Originator { get; set; }
public string OriginalMessageId { get; set; }
// the fields which i needed
public Guid ClientRef {gee; set;}
public ClientChangeMessage ClientChange {get;set;}
public ClientContactChange ClientContactChange {get;set;}
public ClientPictureChangeMessage ClientPictureChangeMessage {get;set;}
}
公共类客户端Saga:Saga,
我开始发短信,
我开始发短信,
我开始发短信,
我把它拿出来
{
[SetterProperty]
公共IClientContactChangeDb客户端ContactChangeDB{get;set;}
[SetterProperty]
公共IBusRefTranslator BusRefTranslator{get;set;}
公共无效句柄(ClientContactChangeMessage)
{
var state=此.Data;
//一些处理逻辑
//检查客户端是否不在数据库中,然后存储状态
state.ClientContactChange=消息;
state.ClientRef=message.ClientRef;
//如果客户机在数据库中,则
MarkAsComplete();
}
公共无效句柄(ClientChangeMessage消息)
{
var state=此.data;
//根据情况更新或创建客户端
//检查依赖项
if(state.ClientContactChange!=null)
{
//处理联系人变更
}
其他的
{
state.ClientChangeMessage=消息;
state.ClientRef=message.ClientRef;
}
}
公共无效句柄(ClientPictureChangeMessage)
{
var state=此.Data;
//如果客户机在那里,则更新saga中的图片else存储
state.ClientPictureChangeMessage=消息;
state.ClientRef=message.ClientRef;
}
}
公共覆盖无效配置HowtoFindsaga()
{
配置映射(s=>s.ClientRef,m=>m.ClientRef);
配置映射(s=>s.ClientRef,m=>m.ClientRef);
配置映射(s=>s.ClienttnRef,m=>m.Id);
}
}
公共类ClientSagaState:IContainSagaData
{
//我不需要这三个字段
公共Guid Id{get;set;}
公共字符串发起者{get;set;}
公共字符串OriginalMessageId{get;set;}
//我需要的田地
公共Guid ClientRef{gee;set;}
公共ClientChangeMessage ClientChange{get;set;}
public ClientContactChange ClientContactChange{get;set;}
公共客户端PictureChangeMessage客户端PictureChangeMessage{get;set;}
}
现在,在我的连接器中,无法创建客户端,而不存在客户端联系人更改消息
佐贺失败的案例:
在再次检查代码时,我找到了原因。我的ClientChangeMessage也继承了IContainSaga数据(我正在尝试但忘记删除)。删除继承链接后,一切正常。(羞愧地垂着头)在所有处理程序中,您需要在Saga数据上设置ClientRef。 所以,你应该:
public void Handle(ClientContactChangeMessage message)
{
Data.ClientRef = message.ClientRef
...
}
由于这些消息中的任何一条都可以启动传奇,因此您需要在传奇状态中设置此值。当其他消息进来时,它将被这个id关联起来,因为已经有一个具有这个id的传奇实例
要引用您的传奇状态变量,请使用数据。尽管如此。很抱歉,我忘了提到这一点,但如果我在数据库中找不到客户机,我会在每个处理程序中设置this.Data.ClientRef(我在上面做了一些更改)。当客户端更改消息到达时,nservicebus仍然无法加载客户端图片更改传奇。如果我在ClientRef上添加了一个unique属性,那么当客户端消息到达时,连接器会失败,错误为unique key constraint error。正如@simon所建议的,您可以在某个地方发布您的问题的报告以查看吗?谢谢。看起来ClientChangeMessage是通过Id而不是ClientRef查找的,这是问题所在吗?在客户端更改消息的情况下,Id和客户端引用是相同的。对不起,我忘记提了that@sa1986你能把复印件上传到什么地方吗?