2009-09-16 100 views
0

這是一件很奇怪的事情。WCF服務內緩慢的MSMQ

我使用WCF創建了一個簡單的基於SOAP的Web服務。當調用'SubmitTransaction'方法時,事務被傳遞給應用程序服務。但是,如果應用程序服務不可用,它將被寫入MSMQ。

像這樣:

public void SubmitTransaction(someTransaction) 
{ 
    try 
    { 
    // pass transaction data to application 
    } 
    catch(SomeError) 
    { 
    // write to MSMQ 
    } 
} 

所以,當一個錯誤occures交易被寫入隊列。現在,直接在我的WCF服務中使用MSMQ API時,一切都很好。每次通話都需要幾毫秒。

例如爲:

... 
catch(SomeError) 
{ 
    // write to MSMQ 
    var messageQueue = new MessageQueue(queuePath); 
    try 
    { 
    messageQueue.Send(accountingTransaction, MessageQueueTransactionType.Single); 
    } 
    finally 
    { 
    messageQueue.Close(); 
    } 
} 

但因爲我想用在該系統的一些其他點的消息隊列功能好,我創建了一個新組件採用消息隊列寫的照顧。

像:

... 
catch(SomeError) 
{ 
    // write to MSMQ 
    var messageQueueService = new MessageQueueService(); 
    messageQueueService.WriteToQueue(accountingTransaction); 
} 

現在使用此設置時,Web服務是突然很慢。從上述毫秒中,每個呼叫現在最多需要4秒。僅僅是因爲消息隊列的東西被封裝在一個新的程序集中。邏輯完全一樣。任何人都知道問題可能是......?

謝謝!

回答

1

好吧,現在我知道了。它與我的日誌記錄設置(log4net)有關。我必須先檢查一下。對不起,偷你的時間..

0

你的代碼,在這裏兩條新線:

var messageQueueService = new MessageQueueService(); 
messageQueueService.WriteToQueue(accountingTransaction); 

你知道這兩個原因造成的問題?也許增加一些日誌記錄或分析,或者在調試器中逐步查看哪一個看起來很慢。

+0

我會盡力去衡量時間。但是這兩行只是我上面顯示的消息隊列的替代品。 var messageQueueService = new MessageQueueService()只做一個新的實例。 messageQueueService.WriteToQueue(accountingTransaction)與第一個示例中的完全相同。如果我將該方法的內容直接複製粘貼到服務中,則一切都會很快。唯一的區別是,它在另一個程序集中... – Chris