2012-03-19 79 views
2

我有一個在開發人員機器和我的開發環境中工作得很好的NServiceBus配置。使NServiceBus丟失消息的東西

但是,當我將它移動到我的測試環境時,我的消息剛剛開始丟棄。

這裏是系統:

  1. 應用程式從大型機系統獲得一個TCP消息,並把它發送到一個MSMQ(稱之爲FromMainframe)。
  2. 在IIS中託管的應用程序具有該「MSMQ」的「處理」方法並處理來自大型機的消息。

在我的測試環境中,第二步只發生了一半。該消息從MSMQ彈出,但未由我的應用程序處理。我的數據是LOST! NServiceBus將它們從隊列中移除,但我從來沒有去處理它們。他們甚至不在錯誤隊列中!

這些都是我在試圖嘗試事情弄清楚發生了什麼事:

  1. 檢查配置文件
  2. 安裝遠程調試的過程看Handle方法是什麼做
    • 從來沒有調用Handle方法(但是當我附加到開發環境中我的斷點在我的Handle方法被擊中,它的一切都完美無缺)。
  3. 重新部署我的dev版本的測試Envioronment並再次嘗試第2步(以防萬一的版本是不完全一樣的。)
  4. 檢查配置再次文件
  5. 檢查錯誤隊列不是填滿
    • 錯誤隊列保持爲空(我希望它會填滿,然後我的數據不會丟失)。
  6. 檢查可以從我的MSMQs
    • 拉東西的任何其他過程中,我關閉了我的IIS網站,並在FromMainframe隊列開始到備份的消息。
    • 當我重新打開時,消息消失相當快(但仍然不是全部消失)。他們消失的速度太快,他們不能通過我的Handle方法進行處理。
  7. 再次檢查配置文件。
  8. 運行NServiceBusTools \ MsmqUtils \ Runner.exe \我
    • 我跑了,重新啓動,一次又一次地跑了它的好辦法!
  9. 再次檢查配置(我一定錯過了SOMETHING吧?)
  10. 檢查開發環境CONFIGS沒有指向測試環境
    • 我不認爲這是可能使用另一臺計算機的MSMQ作爲輸入隊列,但它不傷害檢查。
  11. 尋找任何可能會悄悄地殺死我的消息的catch塊。
  12. 最後一次檢查配置文件。
  13. 在另一臺機器上重新創建我的測試環境(它工作完美)
  14. 在IIS之外運行我的東西。
    • 當我主機以外的IIS(使用NServiceBus.Host.exe)它一切正常。所以它必須是一個IIS的東西嗎?
  15. go crazy並希望堆棧溢出可以提供任何種類的見解。
+0

是NSB託管在IIS內?它配置了哪些協議?你的隊列是交易嗎? MSDTC已啓動並正在運行嗎?應用程序池標識是否在隊列上具有正確的權限?消息是否在系統死信隊列中結束? – 2012-03-19 23:42:27

+0

您是否配置了log4net來捕獲所有nservicebus輸出?你的答案可能在那裏。還有哪個版本的nservicebus? – Sarmaad 2012-03-20 04:27:30

+0

@AdamFyles - NSB在IIS中託管。我需要檢查協議(我認爲這不會影響NSB)。我的MSMQ由NSB設置。所以我會認爲這是事務性的。應用程序池具有正確的權限。這些消息不會在死信隊列中結束。 (他們剛剛離開) – Vaccano 2012-03-20 16:35:26

回答

1

因此,我足夠了解發生了什麼事情以拋出「答案」。

當我安裝NServiceBus自我託管時,我有一個加載消息處理程序的調用。

NServiceBus.Configure.With().LoadMessageHandlers() 

(還有更多的配置,但我忽略他們爲簡潔起見)

當你調用該方法,NServiceBus掃描assmeblies爲實現IHandleMessages<T>類。

因此,不知何故,在我的測試環境機器上,調用IHandleMessages的類的目錄的ServiceBus掃描未能找到我的類(儘管程序集絕對存在)。

原來,如果NServiceBus沒有找到處理消息的東西,它會拋出它 !!!

這是一個總共設計bug在我看來。 NServiceBus的整個想法是不會丟失你的數據,但在這種情況下,它就是這樣做的!

現在,一旦你知道這個陷阱,有幾種方法。

  1. 明確說明你的處理器(S)應該是什麼:

    NServiceBus.Configure.With().LoadMessageHandlers<First<MyMessageType>>()

  2. 更進一步的保護是添加另一個處理程序將處理 「其他」。 IMessage是所有消息有效載荷的基礎,所以如果你在其上放置一個處理程序,它將吸引所有的東西。
    如果您將IMessage設置爲handle after您的消息得到處理,那麼它將處理NServiceBus無法找到處理程序的所有內容。如果拋出異常,並且該方法會導致NServiceBus將消息移動到error隊列中的Handle方法。 (我認爲應該是默認行爲。)

+0

你的工作是在那裏聲明所有的消息處理程序,或者只是一個在消息處理程序集中? – Galen 2012-08-10 02:52:42

+0

@Galen - 我只有一個消息處理程序。我明確地說明了它現在在我的配置中。 – Vaccano 2012-08-10 15:45:41