2012-09-12 109 views
0

我有一個使用NServiceBus的ASP.Net WebAPI應用程序。命令從應用程序發送到運行NSB主機的後端服務器。服務器負責與數據庫進行通信。NServiceBus回覆消息警告

大多數命令都是「火再遺忘」。一個簡單的Bus.Send(...)和Web客戶端立即釋放,以便操作可以異步發生。

唯一的例外是對於在數據庫中創建新記錄的命令。數據庫負責生成新創建實體的ID,我需要將其返回給調用者。這是性能較差,因爲來電者必須堅持,但在我的情況下這是一個可接受的打擊。

我成功地使用這個Bus.Reply()功能,如記錄全雙工樣本英寸我正在回覆一條消息,該消息具有新生成的Id的單個屬性。在網絡方面,我使用任務延續(利用WebAPI的異步功能)以及使用.Register之後的Bus.Send()註冊了回調。

這一切都工作得很好。它以一種非常直接和簡單的方式完成我想要的。唯一的問題是,每一個由客戶端收到響應消息時,它會記錄一個警告如下:

2012-09-11 16:46:44,745 [Worker.26] WARN NServiceBus.Unicast.Transport.Transactional.TransactionalTransport [(null)] - Failed raising 'transport message received' event for message with ID=1faee572-f904-4b09-b1d5-c0bd7c12738d\82936 
System.InvalidOperationException: No handlers could be found for message type: MyProject.Messages.MyEntityCreatedResponseMessage 
    at NServiceBus.Unicast.UnicastBus.HandleTransportMessage(IBuilder childBuilder, TransportMessage msg) 
    at NServiceBus.Unicast.UnicastBus.TransportMessageReceived(Object sender, TransportMessageReceivedEventArgs e) 
    at System.EventHandler`1.Invoke(Object sender, TEventArgs e) 
    at NServiceBus.Unicast.Transport.Transactional.TransactionalTransport.OnTransportMessageReceived(TransportMessage msg) 

我怎樣才能擺脫這種警告?這裏我不需要消息處理程序。

+0

關閉我的頭頂 - 我認爲你需要實現一個虛擬(空)處理程序。否則,MyEntityCreatedResponseMessage事件將以錯誤隊列結尾 –

+0

假處理程序停止警告,但然後我收到另一個警告,說我正在做pub/sub沒有事件...爲什麼它認爲.Reply是被處理,如果我做了.Publish? –

+0

我發現如果我使用Bus.Return而不是Bus.Reply,那我可以完成我之後的任何錯誤或警告。不過,這隻適用於我將新ID視爲ErrorCode,而我的ID恰好是整數。如果我需要傳遞不同類型的ID或其他信息(如實際的錯誤代碼),那麼這將不起作用。 –

回答

2

我建議在服務器甚至在客戶端(瀏覽器)創建的ID。這樣,你的信息仍然可以被遺忘,你不需要同步任何東西。

如果你想用數據庫驅動的IDS堅持,NServiceBus只增加開銷。也可以直接從您的網站代碼直接與數據庫交談並在那裏添加重試。

+0

這將需要像GUID標識符。如果可能的話,我想堅持一個簡單的自動遞增整數。直接寫入數據庫而不是通過公共汽車將是一個選擇,但它會繞過我的架構的其餘部分,所以我不確定是否要走這條路線。真的,我只是希望回覆消息不需要處理程序。 –

+1

沒有說GUID必須用於將實體持久化到數據庫。所有的GUID需要用於識別用於堅持實體和關聯回覆的消息。在這種情況下,GUID將由客戶端創建。 – Rich

+1

@Matt,您不必爲整個項目(或系統)使用相同的體系結構。如果架構正在阻礙最佳解決方案,那麼它就是錯誤的架構。 只要想一下在同步呼叫期間會發生什麼。 Web請求到達,被轉換爲MSMQ消息,消息被處理,回覆被轉換爲MSMQ消息,虛擬消息到達並被處理,然後回覆被髮回到Web客戶端。 所有這些開銷,它有什麼好處? –