我正在尝试开发一个 WCF 服务来处理数百次下载和转换。我已经使用从 ASP.NET Web 应用程序接收消息的事务队列初始化 MSMQ。
在互联网上长期研究后,我的问题是如何管理管理 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 就会删除 msg,因为相信已经完成。