我有一个简单的单向消息传递模式,其中我需要实现Saga,因为我需要调用5个以上的web服务,所以任何一个服务力响应我都不希望saga完成。
但是当我实现saga时,它给出了一个错误:消息类型找不到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.");
}
}发布于 2014-11-27 03:49:27
简而言之:您的传奇永远不会被创建,因为您还没有实现IAmStartedByMessages接口。
更长的答案:根据你的描述,这看起来不是一个很好的传奇用例。如果有一条消息进来,而处理程序实际上只是通过过程代码按顺序调用五个web服务,那么您真正需要的就是一个普通的消息处理程序。如果其中一个web服务失败,您可以抛出异常,消息将通过NSB重试多次。
综上所述,可以使用saga来管理web服务调用工作流。这对您的情况是否有意义,这是您必须确定的。它看起来像这样(非常粗糙,并假设只有2次and服务调用):
当IHandleMessages<WebService1Complete>
IAmStartedByMessages<PlaceOrder>和PlaceOrder流程。PlaceOrder的处理程序设置您的saga数据并启动When服务调用#1。https://stackoverflow.com/questions/27156603
复制相似问题