Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/32.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
NServiceBus-在消息处理程序中使用TransactionScopeOption.Suppress时出现问题_Nservicebus_Transactionscope - Fatal编程技术网

NServiceBus-在消息处理程序中使用TransactionScopeOption.Suppress时出现问题

NServiceBus-在消息处理程序中使用TransactionScopeOption.Suppress时出现问题,nservicebus,transactionscope,Nservicebus,Transactionscope,我有一个端点,它有一个执行FTP工作的消息处理程序。 由于ftp过程可能需要一些时间,因此我将ftp方法封装在TransactionScope中,并使用TransactionScope选项.Suppress来防止事务超时异常 这样做消除了超时异常,但是处理程序被触发了5次 (重试次数在我的配置文件中设置为5) 这些文件是通过ftp传输的,但它们只是通过ftp传输了5次 处理程序看起来好像在10或11分钟后重新启动 一些测试代码如下所示: public void Handle(FtpMessage

我有一个端点,它有一个执行FTP工作的消息处理程序。 由于ftp过程可能需要一些时间,因此我将ftp方法封装在TransactionScope中,并使用TransactionScope选项.Suppress来防止事务超时异常

这样做消除了超时异常,但是处理程序被触发了5次 (重试次数在我的配置文件中设置为5)

这些文件是通过ftp传输的,但它们只是通过ftp传输了5次

处理程序看起来好像在10或11分钟后重新启动

一些测试代码如下所示:

public void Handle(FtpMessage msg)
{
     using (TransactionScope t = new TransactionScope(TransactionScopeOption.Suppress))
     {
          FtpFile(msg);
     }
}
任何帮助都将不胜感激


谢谢。

我的猜测是,如果不完成内部作用域,您将导致NSB创建的外部作用域回滚。这将导致NSB重试FtpMessage

尝试添加:t.Complete();在你打电话到FtpFile后,看看这是否对你有用


编辑:在重新阅读你的问题后,我意识到这并不能解决你的超时问题。您是否尝试增加超时时间?(10分钟是machine.config中的默认最大值,因此您不能在不修改machine.config的情况下将其设置为更高)

我的猜测是,如果不完成内部作用域,您将导致NSB创建的外部作用域回滚。这将导致NSB重试FtpMessage

尝试添加:t.Complete();在你打电话到FtpFile后,看看这是否对你有用


编辑:在重新阅读你的问题后,我意识到这并不能解决你的超时问题。您是否尝试增加超时时间?(10分钟是machine.config中的默认最大值,因此您不能在不修改machine.config的情况下将其设置为更高的值)

如果这确实是一个无法在事务超时内完成的FTP通信,另一种方法是将其转化为传奇

Saga将由FtpMessage启动,在处理程序中,它将异步启动FTP工作,无论是在另一个线程中,还是通过另一个进程,或者其他什么,并在Saga数据中存储足够的信息,以便以后能够查看进度

然后,它将从TimeoutManager请求一个超时,不管超时的时间有多长。在收到超时后,它将在saga数据中查找状态,并检查正在进行的FTP工作。如果已完成,则将传奇标记为已完成,如果未完成,则请求另一个超时


或者,您可以有一个封装FTP通信的进程,该进程承载自己的总线,但没有自己的任何消息处理程序。它可以通过命令行(包括请求端点)接收其FTP信息,完成其工作,然后向请求端点发送一条消息,说明其已完成。这样,您就不必等待超时来继续进程。

如果这确实是一个无法在事务超时内完成的FTP通信,另一种方法是将其转化为传奇

Saga将由FtpMessage启动,在处理程序中,它将异步启动FTP工作,无论是在另一个线程中,还是通过另一个进程,或者其他什么,并在Saga数据中存储足够的信息,以便以后能够查看进度

然后,它将从TimeoutManager请求一个超时,不管超时的时间有多长。在收到超时后,它将在saga数据中查找状态,并检查正在进行的FTP工作。如果已完成,则将传奇标记为已完成,如果未完成,则请求另一个超时


或者,您可以有一个封装FTP通信的进程,该进程承载自己的总线,但没有自己的任何消息处理程序。它可以通过命令行(包括请求端点)接收其FTP信息,完成其工作,然后向请求端点发送一条消息,说明其已完成。这样,您就不必等待超时来继续进程。

我建议将该端点配置为非事务性,而不是试图抑制事务。要做到这一点,请在您的初始化代码中包含.IsTransaction(false)(如果是自托管),或者在使用通用主机时实现IConfigureThisEndpoint,AsA_客户端。

我建议将该端点配置为非事务性,而不是试图抑制事务。如果是自托管,则在初始化代码中包含.IsTransaction(false),或者在使用通用主机时实现IConfigureThisEndpoint,AsA_客户端。

NSB处理的事务是否有任何类型的内置超时,如果是,默认超时是什么,可以修改吗?@David:在主干上配置MsmqTransport(使用v2.0)时,只需设置TransactionTimeout,它已更改为“TransactionTransport”。请注意,最大值受machine.configure中指定的内容限制。谢谢。我将尝试修改machine.config并指定TransactionTimeout,看看它是如何运行的。NSB处理的事务是否有任何内置超时,如果有,默认超时是什么,可以修改吗?@David:在主干上配置MsmqTransport(使用v2.0)时,只需设置TransactionTimeout。这已更改为“TransactionalTransport”。请注意,最大值受到machine.config中指定内容的限制。谢谢。我将尝试修改machine.config并指定TransactionalTimeout,看看它是如何运行的。