无法实现佐贺,
本文关键字:实现 | 更新日期: 2023-09-27 18:32:12
我有一个简单的单向消息传递模式,我需要实现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);
}
}
}
这是我的端点配置
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.");
}
}
简短的回答:你的传奇永远不会被创建,因为你还没有实现IAmStartedByMessages接口。
更长的答案:根据您的描述,这看起来不像是传奇的好用例。 如果传入一条消息,并且处理程序基本上只是通过过程代码按顺序调用五个 Web 服务,那么您真正需要的只是一个普通消息处理程序。 如果其中一个 Web 服务失败,则可以引发异常,并且将通过 NSB 多次重试该消息。
综上所述,可以使用 saga 来管理 Web 服务调用工作流。 这对您的情况是否有意义是您必须确定的事情。 它看起来像这样(非常粗糙,假设只有 2 个 Web 服务调用):
- 您的传奇实现了
IAmStartedByMessages<PlaceOrder>
和IHandleMessages<WebService1Complete>
- 当 PlaceOrder 消息到达时,该过程开始。 PlaceOrder 的处理程序设置您的传奇数据并启动 Web 服务调用 #1。
- 当 Web 服务调用 #1 完成时,它会发布 WebService1Complete 事件
- 然后,WebService1Complete 处理程序运行 Web 服务调用 #2
- 当 Web 服务调用 #2 完成时,它将调用 MarkAsComplete()