无法实现佐贺,

本文关键字:实现 | 更新日期: 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()