我有一个Simple One Way消息传递模式,我需要实现Saga,因为我需要调用超过5个Web服务,所以任何服务提示响应我都不希望传奇完整。
但是当我实现saga时,它给出了一个错误无法找到消息类型的传奇,因此它调用了SagaNotFoundHandler
这是我的Saga数据模型
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);
}
}
}
这是我的endpointConfig
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.");
}
}
答案 0 :(得分:1)
简短回答:您的saga永远不会被创建,因为您尚未实现IAmStartedByMessages接口。
更长的答案:根据您的描述,这看起来不是一个传奇的好用例。如果有消息进入,并且处理程序基本上只是通过过程代码按顺序调用五个Web服务,那么您真正需要的只是一个vanilla消息处理程序。如果其中一个Web服务失败,您可以抛出异常,并且将多次通过NSB重试该消息。
所有这一切都说,可以使用传奇来管理Web服务调用工作流程。这是否对您的案件有意义是您必须确定的事情。它看起来像这样(非常粗糙,假设只有2个webservice调用):
IAmStartedByMessages<PlaceOrder>
和IHandleMessages<WebService1Complete>