WCF和MSMQ以及TransactionScope的长时间处理

7
我正在尝试开发一个 WCF 服务,可以同时处理数百个下载和转换。我已经初始化了 MSMQ,并使用一个事务队列从 ASP.NET Web 应用程序接收消息。
在互联网上做了长时间的研究后,我的问题是如何管理在处理 MSMQ 消息的 WCF 服务方法中进行的长时间过程。
问题在于当下载大小较小时,进程很快就结束了,并且范围返回到 MSMQ 服务,但是如果下载大小较大需要3/4分钟下载,则范围仍然返回完整,但是 MSMQ 服务会重新发送 MSG 到 WCF 服务,导致下载重复。
我猜这是超时问题,但我已经尝试过更好地配置我的 Host app.config,但没有成功。
      <netMsmqBinding>
    <binding name="OrderServiceMsmqBinding" 
             maxRetryCycles="1"
             receiveRetryCount="1"
             retryCycleDelay="00:05:20"
             deadLetterQueue="System"
             receiveErrorHandling="Move"
             exactlyOnce="true"
             durable="true"
             receiveTimeout="00:10:00"
             sendTimeout="00:20:00"
             timeToLive="1.00:00:00" useMsmqTracing="true">
      <security mode="None"></security>
    </binding>
  </netMsmqBinding>

以下是将其转换为WCF服务的方法:

   <OperationBehavior(TransactionScopeRequired:=True, TransactionAutoComplete:=True)> _
Public Sub FfmpegConversion(ffmpegjob As FfmpegJob) Implements IOrderService.FfmpegConversion
    Using sc As New TransactionScope(TransactionScopeOption.Required)
        Try
          ExecuteLongProcess()
        Catch ex As Exception
            Console.WriteLine(ex.Message)
        Finally
            sc.Complete()
        End Try
    End Using
End Sub

更新

经过长时间的试验和研究,我开始认为将长时间的处理过程变成由MSMQ队列触发的方法是不可能的。

我使用了一个不同的线程来管理数据进行解决,但现在的问题是,一旦任务传递给新线程,事务范围(TransactionScope)优势就会丧失,因为MSMQ会删除消息并认为已经完成了。


1
你尝试过将 receiveRetryCount = 0 吗? - tom redfern
1个回答

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接