2010-09-13 83 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

相关问题