【问题标题】:Not able to implement Saga ,无法实现 Saga ,
【发布时间】:2015-01-25 05:18:03
【问题描述】:

我有一个简单的单向消息传递模式,我需要在其中实现 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.");
    }
}

【问题讨论】:

    标签: c# wcf nservicebus esb


    【解决方案1】:

    简短的回答:您的传奇永远不会被创建,因为您尚未实现 IAmStartedByMessages 接口。

    更长的答案:根据您的描述,这看起来不是一个很好的传奇用例。如果有消息进来,而处理程序本质上只是通过过程代码依次调用五个 Web 服务,那么您真正需要的只是一个普通的消息处理程序。如果其中一个 Web 服务失败,您可以抛出异常,并且该消息将通过 NSB 重试多次。

    综上所述,可以使用 saga 来管理 Web 服务调用工作流。这对您的情况是否有意义是您必须确定的。它看起来像这样(非常粗略,假设只有 2 个 Web 服务调用):

    • 您的传奇实现了IAmStartedByMessages&lt;PlaceOrder&gt;IHandleMessages&lt;WebService1Complete&gt;
    • 当 PlaceOrder 消息到达时,该过程开始。 PlaceOrder 的处理程序设置您的传奇数据并启动 Web 服务调用 #1。
    • 当 WebService Call #1 完成时,它会发布一个 WebService1Complete 事件
    • WebService1Complete 处理程序然后运行 ​​Webservice Call #2
    • 当 Webservice Call #2 完成时,它会调用 MarkAsComplete()

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-08-12
      • 2017-04-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-11
      • 1970-01-01
      相关资源
      最近更新 更多