【发布时间】:2016-05-24 14:01:03
【问题描述】:
我正在使用带有 MSMQ 和 DTC 事务的 Hangfire 1.5.6(为了使用远程 MSMQ)。问题是每个长时间运行的作业(> 1 分钟)都会在 1 分钟后自动重新安排。这也是以奇怪的顺序完成的:在取消旧作业之前再次启动作业。
如果我将 Hangfire 配置为不使用 DTC 事务,作业运行正常。
在源代码中,我注意到 MsmqDtcTransaction 正在打开 TransactionScope。在作业执行期间是否需要打开此范围?对于长时间运行的作业(此特定作业将大量数据插入数据库),SQL Server 事务日志会发生什么情况?
我尝试在 app.config 中设置事务超时(这也需要在 machine.config 中进行更改):
<system.transactions>
<machineSettings maxTimeout="02:00:00"/>
<defaultSettings timeout="02:00:00" />
</system.transactions>
有了这些更改,作业在 DTC 事务上运行正常。
这就是 Hangfire 与远程 MSMQ 的工作方式吗?可以不用交易吗?
【问题讨论】:
-
"在作业执行期间是否需要打开 TransactionScope?"取决于如果 SQL 作业失败,是否应在源队列中恢复 MSMQ 消息。
-
你能解决这个问题吗?我们在使用远程 MSMQ 时遇到了同样的问题。长时间运行的作业每分钟重试一次。