MSMQ向遠程服務器發送消息----錯誤總結


一:路徑錯誤(Path)錯誤

如果向遠程服務器發送消息,請使用格式名的形式,如:

FormatName:Direct=TCP:121.0.0.1\\private$\\queue
FormatName:Direct=OS:machinename\\private$\\queuename
FormatName:DIRECT=http://222.10.xx.xx/msmq/Private$/test
注意一:FontName是區分大小寫的。如果表達式為“FORMATNAME:Dire......”,是無法工作的。
但這種表達式不會返回任何錯誤。FontName好像是表達式里唯一區分大小寫的部分。
其他部分可以隨意使用大小寫,例如可以使用“DIRECT”。
注意二:如果遠程服務器為域中的服務器,則可使用Direct=OS:machinename\Private$\...的形式發送消息。
如果遠程服務器為非域中的服務器,則可以使用TCP或http的形式發送。

二:當服務器為非事務型隊列的時候,如果你使用了事務發送,也會有錯誤

 環境說明:向遠程服務器發送消息的時候,遠程服務器使用的是http的格式,
並且為非事務型,如:FormatName:DIRECT=http://222.10.xx.xx/msmq/Private$/test
在我們的程序中啟用了事務向服務器發送消息。結構程序沒有任何錯誤,查看本機的傳出隊列,如下圖:

解決方法:我們隊程序測試檢查了很久,最終改為非事務發送方式可正常發送到服務器。

注意:首先確定遠程服務器的隊列是事務型還是非事務型隊列,然后發送程序一定要和遠程隊列匹配,不然消息無法送達,並且也沒有任何的錯誤提示.

三:向遠程服務器發送消息,消息狀態:正在等待連接

網絡情況是這樣的,測試用的機子都安裝了msmq組件,且都是在工作組模式下工作,兩個機子同在一個局域網內,具有同樣的網段。
我往本機專用消息隊列中收發消息都能成功,且往本機專用消息隊列發送消息,另一台機器從我機子上的專用消息隊列中也能正確接收消息,
就是我往另一台機子的消息隊列發送消息的時候,消息隊列打開成功,消息發送也成功,就是消息全部堆積在本機的傳出隊列里,狀態為正在等待連接。
另一台機的專用消息隊列里根本就沒有我所發送的消息。
並且把程序放到不同的機器上進行測試,一個是英文系統,一個是中文系統。向同一個遠程服務器發送消息都正常,沒有任何錯誤提示,但一直在本機的傳出隊列中。
故障現象:
服務器上MSMQ私有隊列 可以接收 本服務器發送消息,無法接收遠程計算機發送的消息

服務器IP為10.9.3.2
客戶端發送的隊列為 direct=tcp:10.9.3.2/$private/aasmansvc_input
消息狀態:正在等待連接
客戶端可以ping的通服務器IP
部署程序的服務器和發送到遠程的服務器的messagequeue 服務都已經啟動

英文操作系統發送消息隊列:

中文操作系統發送消息隊列:

兩個發送消息的測試機都在本地的傳出隊列中顯示“正在等待連接”狀態。

解決方法:

1)首先考慮客戶端和遠程服務器端的防火牆是否允許通過。本人的測試機器都把防火牆關閉,依然有次問題。

2)檢查遠程服務器的MSMQ設置會有影響,在遠程服務器的消息隊列上點擊右鍵-->屬性,如下圖:

如果你是英文版的系統,在如下圖:

打配置界面,點擊“服務器安全”選項卡,如下圖:

勾選:啟用安全的遠程接收。因為我測試的發消息的服務器的系統都是2003的系統,並且:禁用未經身份驗證的RPC調用。

當然,我使用的是Win7系統作為遠程隊列發送消息的機器是2003的系統,使用上圖的配置可以正常發送消息。反過來從win7向2003的系統中的消息隊列發送消息,則如下設置也可以正常發送:

另外,我在測試過程中,發送事務型消息,從win7到2003測試失敗;從2003到win7測試失敗。不知道為什么事務型消息始終沒有測試通過,有可能是服務器配置,有可能是我的代碼有問題。留着以后慢慢解決吧。

如果你的遠程隊列是域中的服務器,會有點不一樣。點擊屬性后的如下圖:

以上是本人在測試的過程中發現的沒有報錯信息的錯誤,記錄下來以便於方便大家相互學習,如果以后再遇到其他問題,會補充在文章最后。

個人原創,轉載請注明出處。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM