无法实现Saga,

时间:2014-11-26 18:39:01

标签: c# wcf nservicebus esb

我有一个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.");
    }
}

1 个答案:

答案 0 :(得分:1)

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

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

所有这一切都说,可以使用传奇来管理Web服务调用工作流程。这是否对您的案件有意义是您必须确定的事情。它看起来像这样(非常粗糙,假设只有2个webservice调用):

  • 您的传奇实施IAmStartedByMessages<PlaceOrder>IHandleMessages<WebService1Complete>
  • 当PlaceOrder消息到达时,该过程开始。 PlaceOrder的处理程序设置您的传奇数据并启动Webservice Call#1。
  • 当WebService Call#1完成时,它会发布WebService1Complete事件
  • WebService1Complete处理程序然后运行Webservice Call#2
  • 当Webservice Call#2完成时,它会调用MarkAsComplete()