0

我已经使用 nservice bus saga 实现了我的连接器。下面是代码

    public class ClientSaga : Saga<ClientSagaState>, 
            IAmStartedByMessages<ClientChangeMessage>, 
            IAmStartedByMessages<ClientContactChangeMessage>,
            IAmStartedByMessages<ClientPictureChangeMessage>, 
            IHandleTimeout<ClientSagaState>
        {
            [SetterProperty]
            public IClientContactChangeDb ClientContactChangeDb{get;set;}

            [SetterProperty]
            public IBusRefTranslator BusRefTranslator{get;set;}



            public void Handle(ClientContactChangeMessage message)
            {
                var state=this.Data;
                //Some handling logic
                //Check if client is not in database then store the state
                state.ClientContactChange=message;
                state.ClientRef =message.ClientRef;
                //if client is in the data base then 
                MarkAsComplete();
            }

            public void Handle(ClientChangeMessage message)
            {
                 var state=this.data;
                //Update or create the client depending on the situation
                //check for dependencies
                if(state.ClientContactChange !=null)
                {
                     //Handle the contact change
                } 
                else
                 {
                   state.ClientChangeMessage=message;
                    state.ClientRef=message.ClientRef;
                   }
            }
              public void Handle(ClientPictureChangeMessage message)
            {
                     var state=this.Data;
                 //If the client is there then update the picture else store in saga
                   state.ClientPictureChangeMessage =message;
                    state.ClientRef=message.ClientRef;
                   }
            }

            public override void ConfigureHowToFindSaga()
            {
                ConfigureMapping<ClientContactChangeMessage>(s => s.ClientRef, m => m.ClientRef);
                ConfigureMapping<ClientPictureChangeMessage>(s => s.ClientRef, m => m.ClientRef);
                ConfigureMapping<ClientChangeMessage>(s => s.ClienttnRef, m => m.Id);
            }
        }


        public class ClientSagaState: IContainSagaData
        {
            //i dont need these three fields
            public Guid Id { get; set; }
            public string Originator { get; set; }
            public string OriginalMessageId { get; set; }

           // the fields which i needed
           public Guid ClientRef {gee; set;}
           public ClientChangeMessage ClientChange {get;set;}
           public ClientContactChange ClientContactChange {get;set;}
           public ClientPictureChangeMessage  ClientPictureChangeMessage {get;set;}
        }

现在,在我的连接器中,无法在不存在客户端联系人更改消息的情况下创建客户端。

saga 失败的情况:

  1. 当我首先发送客户端图片消息时,它会创建一个新的传奇并存储它。
  2. 然后我发送一条客户端更改消息,它创建另一个 saga 并将其存储,即找不到客户端图片消息创建的 saga
  3. 然后我发送客户联系人更改消息,它以某种方式找到了由客户图片更改创建的传奇,但现在找不到工作人员。

我无法弄清楚为什么会这样。

saga 成功的情况:

  1. 当我首先发送客户端更改消息时,它会创建传奇。
  2. 然后我发送客户端联系人更改消息,它找到了传奇并执行得很好。

谁能解释为什么会发生这种行为。

如果需要更多信息,请告诉我。

谢谢

更新

再次检查我的代码时,我发现了这个问题的原因。我的 ClientChangeMes​​sage 也继承自 IContainSaga 数据(我正在尝试但忘记删除的东西)。删除继承链接后,一切正常。(羞愧地低着头)

4

1 回答 1

1

在所有处理程序中,您需要在 Saga 数据上设置 ClientRef。因此,您将拥有:

  public void Handle(ClientContactChangeMessage message)
        {
            Data.ClientRef = message.ClientRef
            ...
        }

由于这些消息中的任何一条都可以启动 saga,因此您需要在 saga 状态中设置此值。当其他消息进来时,它会与这个 id 相关,因为已经有一个具有这个 id 的 saga 实例。

要引用您的 saga 状态变量,请使用 Data。而不是这个。

于 2013-08-21T19:06:42.423 回答