關於專案中NServiceBus和MEF注入(WCF服務代理失效)的兩個問題

小弟季義欽發表於2013-09-21

問題之一:

最近一個專案兩個NServiceBus終結點,一個執行在客戶端,一個執行在伺服器端。

客戶端的MasterNode設定為伺服器端的地址,這樣就不需要在客戶端安裝NServiceBus的軟體,而不會報RavenDB連線失敗的錯誤了。

但是啟動的時候會報錯:“無法建立佇列,或者沒有對應的許可權”。win7下面,管理員許可權執行也是一樣。暫時的解決方法是手動建立一個事務性的訊息佇列。


然後我又安裝伺服器端的終結點,首先安裝了NServiceBus的軟體(這個軟體主要就是安裝RavenDB,安裝訊息佇列等。),然後啟動服務端的終結點,仍然是同樣的錯誤,由此可知這個錯誤和是否安裝了NServiceBus的軟體是沒有關係的。


這個問題亟需解決,不可能讓使用者用我的軟體還要去手動建立一個訊息佇列吧。


解決方法:

目前我暫時的解決方法就是利用.Net中的MessageQueue這個類的create方法顯示建立訊息佇列,注意第一個引數是訊息佇列名稱,第二個引數設定為true表示建立的訊息佇列為事務型訊息佇列。


問題之二:

我在NServiceBus啟動的start函式中利用MEF注入了兩個類,在定時器中定時呼叫這兩個類的方法,開始一段時間大概幾十分鐘的樣子執行沒有問題。

但是時間長了,就會丟擲異常:“The communication object. System.ServiceModel.Channels.ServiceChannel. can not be used for communication beacause it is in the faulted state”,有時候異常是“The socket connection has disconnected...


開始我以為是MEF啟動時候注入一次物件,之後定時器中定期使用這兩個物件,時間長了這兩個物件失效了。。。

後來和別人聊到這個問題,才注意到可能和WCF服務有關,然後才發現我是在注入物件的類的建構函式中建立了WCF服務代理,之後每次在定時器的這兩個物件的呼叫的方法中呼叫了WCF服務,時間長了WCF服務就失效了。。。


解決方法:

(1)每次呼叫定時器都重新Compose一次,即重新進行一次MEF物件注入;每次都注入,都意味著每次都會建立新的WCF服務代理,所以效率較低。

(2)還是隻在start的時候注入一次,我想MEF注入的物件是不會失效的,因為不是遠端代理物件嘛!!! 然後每次呼叫注入物件的方法中,首先判斷WCF服務時候失效,如果失效了就顯式重新建立WCF服務代理。

如果判斷WCf服務是否失效呢?

很簡單,在WCF服務中預留一個空方法,每次呼叫真正的方法之前呼叫一次這個方法,捕獲異常,如果出現異常,則說明失效了。


相關文章