在Rebus和NServiceBus應用程序之間提供橋接的最佳方式是什麼?在我的應用程序中,需要向我的舊NServiceBus 2.0主機發送/接收消息。Rebus和NServiceBus應用程序之間的橋樑
通過深入研究,我覺得在Rebus中需要NServiceBusMessageFormatter。我不確定我要前往的方向。
在Rebus和NServiceBus應用程序之間提供橋接的最佳方式是什麼?在我的應用程序中,需要向我的舊NServiceBus 2.0主機發送/接收消息。Rebus和NServiceBus應用程序之間的橋樑
通過深入研究,我覺得在Rebus中需要NServiceBusMessageFormatter。我不確定我要前往的方向。
我可以想象幾種解決方案,可能比我在這裏描述的那個更簡單。例如,如果只是爲您的NServiceBus端點提供單向消息通道,則可以啓動一個簡單的Rebus端點,其實現方式爲IHandleMessages<object>
,將所有消息轉發到NServiceBus端點 - 並且該Rebus端點甚至可以託管在舊的NServiceBus端點中。
但是您聲明您需要能夠發送/接收消息,我認爲您需要能夠通過NServiceBus端點進行請求/回覆。
爲了達到這個目的,我將NServiceBus端點視爲任何其他的東西,我必須與之集成。儘管NServiceBus端點有一個異步API,這意味着我必須能夠以某種方式確定在收到NServiceBus應答時回覆的人。
這可以通過兩種方式來實現,因爲我看到它:
做爲此,包括與發送到您的NServiceBus端點請求rebus-return-address
頭值,並確保端點複製這種原始的返回地址發送回您的橋樑全部回覆。
這可以通過將原始Rebus返回地址存儲在請求的自定義標頭中完成,然後使用NServiceBus的鉤子來確保將標頭複製到從傳統NServiceBus端點發送的任何應答。
這樣,您的網橋就可以對接收到的NServiceBus消息執行bus.Advanced.Routing.Send(originalRebusReturnAddress, reply)
,以便將回復顯式路由回原始請求者。
這樣一來,你會拿出一個新的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可能看起來簡單(或更加複雜;))
第一種方法是更適合的場景我有。因爲在這種情況下我有固定的Rebus和NServiceBus端點。但現在我面臨的主要障礙是,我必須爲NServiceBus和Rebus提供通用的MessageFormatter。我試圖提供相同的,但我面臨許多複雜問題。我嘗試在Rebus中使用NServiceBus正在使用的XmlMessageFormatter。有什麼想法呢? –
如何在Rebus解決方案中託管NServiceBus端點以發送/接收消息到傳統NServiceBus端點?那麼我可以使用上面建議的第二種方法 –
當然,您也可以做到這一點 - 但無論您在哪裏託管您的橋接端點,您都需要一些方法來確定在接收到答覆時應由誰發送答覆在NServiceBus橋樑中 – mookid8000
順便說一句,nServiceBus使用XmlMessageFormatter只爲運輸 –