簡體   English   中英

MSMQ - 無法從多播隊列接收

[英]MSMQ - Cannot receive from Multicast queues

我試圖了解多播如何在MSMQ中工作,但我甚至無法接收消息,即使是在同一台機器上也是如此。 我顯然做錯了什么但看不清楚是什么。

這是我在的地方:

我手動創建了一個名為MulticastTest的非事務性專用隊列,然后將多播地址設置為234.1.1.1:8001 然后我的測試發送應用程序這樣做:

MessageQueue queue = new MessageQueue("FormatName:MULTICAST=234.1.1.1:8001");
queue.Send("Hello World");

這工作,它至少似乎發送我在同一台機器上的傳出隊列中看到的消息。 至少我認為這是正確的,如果不是,請告訴我。

所以現在我嘗試運行我的接收應用程序(在同一台機器上或配置為相同多播地址的不同機器上),我無法讓它工作。 如果我試試這個:

MessageQueue queue = new MessageQueue("FormatName:MULTICAST=234.1.1.1:8001");
var message = queue.Receive();

它根本不起作用, Receive()方法拋出一個異常說:

指定的格式名稱不支持請求的操作。 例如,無法刪除直接隊列格式名稱

如果我嘗試將接收隊列設置為.\\private$\\MulticastTest它至少等待消息但沒有任何反應,所有消息仍然保留在傳出隊列中。

那么我做錯了什么? 是否需要運行某種服務以便MSMQ從傳出隊列發送消息?

我也試過根據這個問題向ANONYMOUS USER提供完全權限,但這沒有任何影響。

經過多次實驗,我終於找到了使組播隊列工作所需的正確步驟。

首先,確保您已安裝MSMQ多播功能! 盡管能夠在我的一台服務器上創建一個帶有多播地址的隊列,但服務器管理器實際上告訴我該組件未安裝。

在我的本地計算機上嘗試此操作后,我在事件日志中找到了此消息:

消息隊列找到本地計算機的多個IP地址。 消息隊列將使用PGM驅動程序確定的默認IP地址來生成多播消息。 要使用其他IP地址,請將\\ HKLM \\ Software \\ Microsoft \\ MSMQ \\ Parameters \\ MulticastBindIP注冊表值設置為以下有效IP地址之一:[此處列出的IP地址]

事實證明我的局域網有多個IP地址,所以首先我使用發送消息所需的正確IP地址添加此注冊表項,然后重新啟動消息隊列服務。 更多細節可以在這里找到: https//technet.microsoft.com/en-us/library/cc770813%28v=ws.10%29.aspx?f=255&MSPPError=-2147217396

接下來,我必須為ANONYMOUS LOGON用戶添加消息隊列的權限,因此我給予(至少)接收和發送權限。

現在發送一些東西。 您需要的隊列名稱的正確格式如下:

FormatName:MULTICAST=234.1.1.1:8001

或者你的多播IP地址/端口是什么。 我的發送應用程序現在發送了消息,我可以看到它現在出現在我的私有隊列中,該隊列與此多播地址相關聯。 這意味着郵件已經發送。

在接收端,我需要監聽私有隊列(不是上面的組播格式),所以我聽:

.\private$\MulticastTest

最后,我看到我發送的消息出現在接收端。

作為一個完整性檢查,我設置另一個指向相同多播地址的隊列(確保在該機器上我遵循上述相同的步驟)並且現在可以從一台機器發送消息並讓它由多台機器接收。

我希望這個答案對其他人有幫助,因為這對我來說是一次真正的試錯。

我通過其他方式解決了同樣的問題:

  1. 使用多播地址創建專用隊列。
  2. 接下來在生產者中創建隊列

    const string QUEUE_PATH = @“formatname:MULTICAST = 234.1.1.1:8001”

    MessageQueue mq = new MessageQueue(QUEUE_PATH)

  3. 接下來創建消費者隊列( 每個消費者具有不同的名稱! ):

consumer1:

const string QUEUE_PATH = @“。\\ Private $ \\ MSMQ-Task3-Consumer-1”;

MessageQueue mq =!MessageQueue.Exists(QUEUE_PATH)? MessageQueue.Create(QUEUE_PATH):new MessageQueue(QUEUE_PATH);

mq.MulticastAddress =“234.1.1.1:8001”;

consumer2:

const string QUEUE_PATH = @“。\\ Private $ \\ MSMQ-Task3-Consumer-2”;

MessageQueue mq =!MessageQueue.Exists(QUEUE_PATH)? MessageQueue.Create(QUEUE_PATH):new MessageQueue(QUEUE_PATH);

mq.MulticastAddress =“234.1.1.1:8001”;

來源可以在這里找到: https//github.com/constructor-igor/TechSugar/tree/master/MessageQueue

可以找到簡短的設置說明: https//github.com/constructor-igor/TechSugar/wiki/MessageQueue

暫無
暫無

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

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