2014-02-08 58 views
1

在Rebus和NServiceBus應用程序之間提供橋接的最佳方式是什麼?在我的應用程序中,需要向我的舊NServiceBus 2.0主機發送/接收消息。Rebus和NServiceBus應用程序之間的橋樑

通過深入研究,我覺得在Rebus中需要NServiceBusMessageFormatter。我不確定我要前往的方向。

+0

順便說一句,nServiceBus使用XmlMessageFormatter只爲運輸 –

回答

1

我可以想象幾種解決方案,可能比我在這裏描述的那個更簡單。例如,如果只是爲您的NServiceBus端點提供單向消息通道,則可以啓動一個簡單的Rebus端點,其實現方式爲IHandleMessages<object>,將所有消息轉發到NServiceBus端點 - 並且該Rebus端點甚至可以託管在舊的NServiceBus端點中。

但是您聲明您需要能夠發送/接收消息,我認爲您需要能夠通過NServiceBus端點進行請求/回覆。

爲了達到這個目的,我將NServiceBus端點視爲任何其他的東西,我必須與之集成。儘管NServiceBus端點有一個異步API,這意味着我必須能夠以某種方式確定在收到NServiceBus應答時回覆的人。

這可以通過兩種方式來實現,因爲我看到它:

  1. 稍微修改您的NServiceBus端點保留原始返回地址上所涉及的郵件頭。

做爲此,包括與發送到您的NServiceBus端點請求rebus-return-address頭值,並確保端點複製這種原始的返回地址發送回您的橋樑全部回覆。

這可以通過將原始Rebus返回地址存儲在請求的自定義標頭中完成,然後使用NServiceBus的鉤子來確保將標頭複製到從傳統NServiceBus端點發送的任何應答。

這樣,您的網橋就可以對接收到的NServiceBus消息執行bus.Advanced.Routing.Send(originalRebusReturnAddress, reply),以便將回復顯式路由回原始請求者。

  1. 用一個傳奇做你的傳統端點以外的所有家務。

這樣一來,你會拿出一個新的Guid爲每個到來的滷麪請求,並開始與該GUID裏面,從傳入請求的rebus-return-address頭的值沿着傳奇。然後,您可以將guid作爲請求上的NServiceBus關聯ID分配給您的傳統NServiceBus端點,該端點將自動複製到所有答覆中。

然後,回到橋上,你創建可用於轉發傳入NServiceBus消息(必須是從傳統的端點回復)一個特殊的信息包裝,看起來像這樣:

public class ForwardedReply 
{ 
    public Guid CorrelationId { get; set; } 

    public object ReplyMessage { get; set; } 
} 

和那麼你做這樣的事情在你的頭(只)NServiceBus消息處理程序:

public class BridgeIncomingNsbMessagesToRebus : NServiceBus.IHandleMessages<object> 
{ 
    public Rebus.IBus Bus { get; set; } 

    public void Handle(object msg) 
    { 
     Bus.SendLocal(new ForwardedReply { 
      CorrelationId = GetCorrelationIdFrom(msg), 
      ReplyMessage = msg 
     }); 
    } 
} 

這樣,你的代理傳奇可以通過其CorrelationId屬性關聯傳入ForwardedReply消息,並有傳奇處理器將ReplyMessage的內容發送回原始發件人,該發件人的地址存儲在傳奇中。

哇,這是一個很長的答案 - 我希望它對您有意義:)但請記住 - 根據您需要能夠使用傳統端點的消息傳遞模式 - eveyrything可能看起來簡單(或更加複雜;))

+0

第一種方法是更適合的場景我有。因爲在這種情況下我有固定的Rebus和NServiceBus端點。但現在我面臨的主要障礙是,我必須爲NServiceBus和Rebus提供通用的MessageFormatter。我試圖提供相同的,但我面臨許多複雜問題。我嘗試在Rebus中使用NServiceBus正在使用的XmlMessageFormatter。有什麼想法呢? –

+0

如何在Rebus解決方案中託管NServiceBus端點以發送/接收消息到傳統NServiceBus端點?那麼我可以使用上面建議的第二種方法 –

+0

當然,您也可以做到這一點 - 但無論您在哪裏託管您的橋接端點,您都需要一些方法來確定在接收到答覆時應由誰發送答覆在NServiceBus橋樑中 – mookid8000