C# 无法实现传奇,
我有一个简单的单向消息传递模式,我需要实现Saga,因为我需要调用5个以上的web服务,所以任何服务都无法响应,我不希望Saga完整 但当我实现saga时,它给出了一个错误,无法找到消息类型的saga,因此它调用SagaNotFoundHandler 这是我的传奇数据模型C# 无法实现传奇,,c#,wcf,nservicebus,esb,C#,Wcf,Nservicebus,Esb,我有一个简单的单向消息传递模式,我需要实现Saga,因为我需要调用5个以上的web服务,所以任何服务都无法响应,我不希望Saga完整 但当我实现saga时,它给出了一个错误,无法找到消息类型的saga,因此它调用SagaNotFoundHandler 这是我的传奇数据模型 public class MySagaData : ContainSagaData { [Unique] public Guid OrderID { get; set; } public strin
public class MySagaData : ContainSagaData
{
[Unique]
public Guid OrderID { get; set; }
public string SomeData { get; set; }
}
这是Saga和消息处理程序类
public class PlaceOrderHandler : Saga<MySagaData> ,IHandleMessages<PlaceOrder>
{
public override void ConfigureHowToFindSaga()
{
ConfigureMapping<PlaceOrder>(m => m.OrderID).ToSaga(s => s.OrderID);
}
public void Handle(PlaceOrder message)
{
try
{
Console.WriteLine("ORder Recevied....for ID {0}", message.OrderID);
//invoke 5 web service methods();
MarkAsComplete();
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
}
公共类PlaceOrderHandler:Saga,IHandleMessages
{
公共覆盖无效配置HowtoFindsaga()
{
配置映射(m=>m.OrderID).ToSaga(s=>s.OrderID);
}
公共无效句柄(PlaceOrder消息)
{
尝试
{
WriteLine(“为ID{0}接收的订单,”,message.OrderID);
//调用5个web服务方法();
MarkAsComplete();
}
捕获(例外e)
{
控制台写入线(e.Message);
}
}
}
这是我的端点配置
public class EndpointConfig : IConfigureThisEndpoint, AsA_Server, IWantCustomInitialization,IWantToRunWhenBusStartsAndStops
{
public void Init()
{
Configure.With()
.DefaultBuilder()
.UseTransport<Msmq>()
.MsmqSubscriptionStorage()
.InMemorySagaPersister()
.UseInMemoryTimeoutPersister()
.UnicastBus();
}
public void Start()
{
Console.WriteLine("This is the process hosting the saga.");
}
public void Stop()
{
Console.WriteLine("Stopped.");
}
}
public class EndpointConfig:IConfigureThisEndpoint、AsA_服务器、IWantCustomInitialization、iwantToRunshenbusStartAndStops
{
公共void Init()
{
用()配置
.DefaultBuilder()
.UseTransport()
.MsmqSubscriptionStorage()
.inMemorySagPersister()中的
.UseInMemoryTimeoutPersister()中使用
.UnicastBus();
}
公开作废开始()
{
WriteLine(“这是承载传奇的过程。”);
}
公共停车场()
{
控制台。写入线(“停止”);
}
}
简短回答:您的传奇永远不会被创建,因为您还没有实现IAmStartedByMessages接口
更详细的回答:根据您的描述,这看起来不像是一个很好的传奇案例。如果传入一条消息,并且处理程序实际上只是通过过程代码顺序调用五个web服务,那么您真正需要的只是一个普通的消息处理程序。如果其中一个web服务失败,您可以抛出异常,该消息将通过NSB重试多次
综上所述,可以使用saga来管理web服务调用工作流。这对你的案子来说是否有意义是你必须决定的事情。它看起来像这样(非常粗糙,假设只有两个webservice调用):
- 您的传奇实现了
和IAmStartedByMessages
IHandleMessages
- 当PlaceOrder消息到达时,该过程开始。PlaceOrder处理程序设置您的saga数据并启动Webservice调用#1
- 当WebService调用#1完成时,它将发布WebService 1完成事件
- WebService1Complete处理程序然后运行Webservice调用#2
- 当Webservice调用#2完成时,它调用MarkAsComplete()