WCF& MSMQ& TransactionScope漫长的过程

时间:2012-07-22 13:54:24

标签: wcf msmq msmq-wcf

我正在尝试开发一个WCF服务,它可以同时处理数百次下载和转换。 我已经使用从ASP.NET Web应用程序接收消息的事务队列初始化了MSMQ。

经过长期的互联网研究后,我的问题是如何管理管理MSMQ消息的WCF服务方法中的长进程。

问题是,在小尺寸下载时,过程很快完成,并且范围返回完成到MSMQ服务,但如果下载大小很大并且需要下载3/4分钟,则范围返回仍然完成,但MSMQ服务将MSG重新发送到WCF服务,我有重复的下载。

我想这是一个超时问题,但我已经尝试更好地配置我的主机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就会认为已经完成了删除msg。 / p>

1 个答案:

答案 0 :(得分:0)

这里发生的事情是交易超时。 您可以在machine.config文件中指定一个新值,这就是获取长事务的方式......

http://blogs.inkeysolutions.com/2012/01/managing-timeouts-while-using.html