想象一下以下設置:Silverlight客戶端通過網絡使用WCF服務通過網絡傳輸序列化命令,WCF服務反過來將命令反序列化並使用NServiceBus將其發送到通用主機負責處理該命令。 WCF服務在發送命令時註冊了一個要調用的回調函數。通用主機驗證命令並返回錯誤代碼(0 ==成功或> == ==失敗)。Wcf服務正在等待NServiceBus的回覆,永遠不會到來
注意:WCF服務是在內置的WCF服務之後建模的。不同的是,這個WCF服務接收到一個'通用命令'(不是IMessage),將它反序列化爲一個真正的命令(它實現了IMessage),然後將反序列化的命令發送到總線。
當發生意外異常時,該命令會在錯誤隊列中排隊(在一定數量的重試之後)。在這一點上,發起WCF服務坐在那裏閒置,不知道剛剛發生的事情。稍後,Silverlight客戶端將根據WCF客戶端代理配置超時。
東西在我腦海中是模糊的:
- 不NServiceBus處理這種情況下以任何方式?什麼時候拋出超時異常(如果有的話)?或者這對薩迦是獨一無二的?
- 假設我使用[OperationContract(AsyncPattern = true)],是否有任何WCF相關的超時設置會終止服務操作?或者將EndXXX方法以某種方式稱爲?或者它會永遠坐在那裏,泄漏,等待永遠不會來的東西?
方式進行:
- 重用現有的超時機制,提供的東西不漏。
- 在wcf服務和nservicebus之間構建我自己的超時機制。
- 當命令落在錯誤隊列中時以某種方式通知wcf服務。
- 使用WCF服務層中的全面回調消息處理程序構建我自己的異步通知機制。
我做的事:
- 運行提供NServiceBus的例子。
- 尖刺的快樂案例。
對如何進行任何指導意見是值得歡迎的,是它的博客文章,郵件列表條目,...
一些動機採摘我目前的做法
- 我試圖槓桿NServiceBus的一些可擴展性優勢(在後期使用分發器)。
- 我不想承載一個gazillion WCF服務(每個命令一個),這就是爲什麼我製作了一個類似總線的WCF服務。
- 儘管這是一些請求/響應風格,但我最關心的是如何優雅地處理不經過的命令回覆。
這不是一個昂貴的操作 - 當單獨的過程處於負載狀態時,我們可能需要等待一段時間,由於發生了意想不到的事情,我們可能得不到答案,但我們應該能夠正常處理這些情況。 – 2010-09-15 07:15:49
你需要立即迴應嗎?您能否向用戶顯示適當的結果並稍後檢查狀態?很像這個網站,評論並沒有真正承諾。如果您發表評論並刷新它就會消失。你能採取同樣的方法嗎? – 2010-09-15 13:19:14
我確實得到了「感謝您的命令,我們會盡快執行它」,當它完成後,我們會通過電子郵件發送給您。「 – 2010-09-15 14:56:07