2010-09-13 37 views
1

我有一個端點,它有一個執行一些FTP工作的消息處理程序。 由於ftp進程可能需要一些時間,我使用TransactionScopeOption.Suppress封裝了TransactionScope中的ftp方法,以防止事務超時異常。NServiceBus - 在消息處理程序中使用TransactionScopeOption.Suppress時出現的問題

這樣做擺脫了超時異常,但處理程序被解僱了5次 (重試次數設置爲5在我的配置文件)

文件已ftp'd確定,但他們只是FTP」 d 5次。

處理程序看起來像10或11分鐘後重新啓動。

一些測試代碼如下:

public void Handle(FtpMessage msg) 
{ 
    using (TransactionScope t = new TransactionScope(TransactionScopeOption.Suppress)) 
    { 
      FtpFile(msg); 
    } 
} 

任何幫助將不勝感激。

謝謝。

回答

0

我的猜測是,通過沒有完成的範圍內你造成的外部範圍,由NSB創建,回滾。這將導致NSB重試您的FtpMessage。

嘗試添加:t.Complete();在你打電話給FtpFile之後,看看它是否適合你。

編輯:重讀你的問題後,我意識到,這不會解決您的超時問題。你有沒有試圖增加超時時間? (10分鐘是在machine.config中默認包括maxValue,所以你不能將其設置爲高,而無需修改machine.config中)

+0

來做交易的處理有任何形式的內置的超時,如果是的話,默認的超時時間,並可以將其進行修改? – 2010-09-13 17:15:01

+0

@David:在配置MsmqTransport(使用v2.0)時只需設置TransactionTimeout在主幹上,這已更改爲「TransactionalTransport」。注意最大值受到machine.config中指定內容的限制 – 2010-09-13 17:26:50

+0

感謝您的支持。我會嘗試修改machine.config並指定TransactioTimeout並看看它是如何發生的。 – IGoor 2010-09-14 08:20:28

2

如果這確實是不能交易的超時時間內完成的FTP通信,另一種方法是把它變成佐賀。

傳奇將由FtpMessage啓動,並且在處理程序中它將異步啓動FTP工作,無論是在另一個線程中,還是通過另一個進程或其他任何方式,並且將足夠的信息存儲在傳奇數據中以便能夠查找稍後的進展。

然後,它會從TimeoutManager請求超時但是長期是有道理的。收到該超時後,它將查找傳奇數據中的狀態,並檢查正在進行的FTP工作。如果完成,則將該事件標記爲完整,如果沒有,則請求另一個超時。

或者,你可以有一個過程包裝承載自己的公交車,但並沒有任何自己的消息處理程序的FTP通信。它可以通過命令行(包括請求端點)接收FTP信息,完​​成它的工作,然後將消息發送回請求端點並說明它已完成。然後,您不必等待超時繼續進行。

2

我建議配置該端點爲非事務性,而不是試圖壓制事務。通過在初始化代碼中包含.IsTransactional(false)來實現這一點,如果是自託管或通過在使用通用主機時實現IConfigureThisEndpoint,AsA_Client。通過NSB

相關問題