2017-01-16 169 views
1

我需要確認傳送到遠程隊列,並根據MSDN Exists()方法不支持遠程隊列檢查。MSMQ同步寫入遠程隊列

根據我的消息傳遞可在以下兩種情況下

  • 遠程機器不可到達失敗。
  • 機器上的隊列不存在或被刪除。

我正在使用事務性隊列。設置AdministrationQueueUseDeadLetterQueue可確保消息不會丟失。

但我想要一個同步的方式發送消息到遠程機器隊列。 MSMQ是否支持這項功能?即使設計不支持,它又有可能如何?

回答

0

MSMQ是否支持這種設計,即使設計不支持 也不可能?

MSMQ服務沒有任何內置的方式來支持雙工信息。

爲了達到這個目的,您需要在排隊通道的兩端編碼。但是,這通常是最複雜的。

以下鏈接介紹如何通過使用System.Messaging來實現這一目標:

https://www.codeproject.com/Articles/999238/Efficient-Message-Correlation-in-MSMQ

它是基於使用的correlationID頭與ReceiveByCorrelationId()操作,這是由於性能原因不好是衆所周知的。

https://msdn.microsoft.com/en-us/library/ms751435(v=vs.110).aspx

另一種方法是使用WCF和一個輔助庫調用Duplex MSMQ

這樣做的另一種方法是使用WCF,但是,這仍然使用System.Messaging依靠人工響應

https://www.codeproject.com/Articles/41907/WCF-Duplex-MSMQ

然而,所有的這些方法是非常好的,所有的介紹不必要的複雜性。

我需要確認的交貨遠程隊列

我想我們需要了解的是你的「證實」的意思。如果您使用事務隊列,那麼這將爲從一個應用程序到另一個應用程序的消息傳輸提供有保證的傳送語義。

另一方面,如果您需要實時響應,那麼使用消息隊列可能不適合您的目的。

如果您不得不使用MSMQ,那麼您可能會比使用商業產品做得更差。我廣泛使用了NServiceBus,它使用MSMQ,但增加了強大的消息交換模式,如請求回覆。這是一種付費產品,但如果您只需要單線程操作,那麼您可以使用免費版本。

我需要的是成功的實時響應和失敗的消息..

如果我理解正確的這個,那麼你的要求是確認,這MSMQ不支持。請參閱:

https://msdn.microsoft.com/en-us/library/ms978430.aspx#bdadotnetasync2_topic4

https://msdn.microsoft.com/en-us/library/ms707129(v=vs.85).aspx

+0

這是一個很大的反響。 是的,你是對的。我正在使用tramctional隊列「Comfirmed Delivery」。我需要的是對成功和失敗消息的實時響應,以便我可以停止向隊列發送更多消息。 您提到的第一個codeproject文章不適合我的場景。消息的使用者是從目標隊列中讀取的Windows服務。如果我們在該隊列上等待帶有CorrelationID的消息,我們可以輸入消息首先被接收的競爭條件,並且我們仍然會等待消息。 – Xlr8

+0

@ Xlr8 - 你爲什麼需要排隊運輸?另外,您是在談論請求回覆,還是您需要確認? –

+0

我需要請求回覆。我應該等到消息被接收或拒絕。 我知道MSMQ適用於斷開連接的系統,但在我的情況下,我們假設系統處於聯機狀態。 – Xlr8