我正在尝试开发一个 WCF 服务,可以同时处理数百个下载和转换。我已经初始化了 MSMQ,并使用一个事务队列从 ASP.NET Web 应用程序接收消息。
在互联网上做了长时间的研究后,我的问题是如何管理在处理 MSMQ 消息的 WCF 服务方法中进行的长时间过程。
问题在于当下载大小较小时,进程很快就结束了,并且范围返回到 MSMQ 服务,但是如果下载大小较大需要3/4分钟下载,则范围仍然返回完整,但是 MSMQ 服务会重新发送 MSG 到 WCF 服务,导致下载重复。
我猜这是超时问题,但我已经尝试过更好地配置我的 Host app.config,但没有成功。
在互联网上做了长时间的研究后,我的问题是如何管理在处理 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会删除消息并认为已经完成了。
receiveRetryCount = 0
吗? - tom redfern