簡體   English   中英

Nservice總線Sagas實現

[英]Nservice bus sagas implemetation

我有一個nservice總線項目,我將其稱為連接器。 我的連接器接收各種消息,例如ClientChangeMes​​sage,ClientContactChangeMes​​sage。 我的連接器尚未實現傳奇,因此我為每個消息都配備了處理程序,因此對於ClientChangeMes​​sage,我具有ClientChangeMes​​sageHandler,當連接器接收到ClientChangeMes​​sage時,將觸發該事件;當我接收到ClientContactChangeMes​​sage時,將觸發一個ClientContactChangeMes​​sageHandler。

現在,在查看sagas實現時,我發現自己在編寫以下代碼(如果Client contact消息在ClientChange消息之前,即該客戶端在數據庫中不存在):

public class ClientContactChangeMessageHandler : ClientMessageHandler, 
    IHandleMessages<ClientContactChangeMessage>, 
    IAmStartedByMessages<ClientContactChangeMessage>, 
    IHandleMessages<ClientChangeMessage>
{
    [SetterProperty]
    public IClientContactChangeDb ClientContactChangeDb{get;set;}

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

    static ClientContactChangeMessageHandler()
    {
        Logger = LogManager.GetLogger(typeof (ClientContactChangeMessageHandler));
    }

    static ILog Logger;

    public void Handle(ClientContactChangeMessage message)
    {
        //Some handling logic
    }

    public void Handle(ClientChangeMessage message)
    {
        throw new NotImplementedException();
    }

    public override void ConfigureHowToFindSaga()
    {
        ConfigureMapping<ClientContactChangeMessage>(s => s.Id, m => m.Id);
        ConfigureMapping<ClientChangeMessage>(s => s.Id, m => m.Id);
        // Notice that we have no mappings for the OrderAuthorizationResponseMessage message. This is not needed since the HR
        // endpoint will do a Bus.Reply and NServiceBus will then automatically correlate the reply back to
        // the originating saga
    }
}


public class ClientMessageHandler : BaseMessageHandler
{
}

public class BaseMessageHandler : Saga<MySagaData>
{
}

public class MySagaData : IContainSagaData
{
    public Guid Id { get; set; }
    public string Originator { get; set; }
    public string OriginalMessageId { get; set; }
}

從示例中可以看出,我現在還必須實現CLientChangeMes​​sage的句柄,現在我已經為我的ClientChangeMes​​sage定義了一個處理程序,我是否必須在這里再次處理它,因為如果能及時處理ClientChangeMes​​sage的話我希望它可以被ClientChangeMes​​sageHandler捕獲和處理,而不是不被此處理。

當且僅當我在數據庫中找不到該客戶端的本地引用時,我才想存儲一條消息。 在網上查看傳奇故事的示例時,我沒有看到要處理的特定地點或條件。 我希望我將消息存儲在ClientContactChange處理方法中。

任何幫助將非常感激,

謝謝

更新:

看來我不太了解如何實現NService Bus Saga。 我根據我在這里犯的錯誤是,我認為客戶聯系人更改是單個實體,即獨立於客戶更改消息。 因此,因此我認為僅出於客戶聯系變更而實施Saga是錯誤的。 這是我必須更改代碼的方式:

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

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



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

        public void Handle(ClientChangeMessage message)
        {
            //Update or create the client depending on the situation
            //check for dependencies
            if(this.ClientContactChange !=null)
            {
                 //Handle the contact change
            }
        }

        public override void ConfigureHowToFindSaga()
        {
            ConfigureMapping<ClientContactChangeMessage>(s => s.ClientRef, m => m.ClientRef);
            ConfigureMapping<ClientChangeMessage>(s => s.ClienttnRef, m => m.Id);
            // Notice that we have no mappings for the OrderAuthorizationResponseMessage message. This is not needed since the HR
            // endpoint will do a Bus.Reply and NServiceBus will then automatically correlate the reply back to
            // the originating saga
        }
    }


    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;}

    }

由於兩個處理程序都處理相同的消息類型,因此兩者都將被調用。 如果願意,可以使用ISpecifyMessageHandlerOrdering指定調用它們的順序。 此外,您可以根據可能解決第二個問題的條件來短路此鏈。

如果這不起作用,則您可能需要考慮對消息進行版本控制以以一種優美的方式支持這兩種方案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM