何百ものダウンロードと変換を一緒に処理するWCFサービスを開発しようとしています。ASP.NETWebアプリケーションからメッセージを受信するトランザクションキューを使用して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キューによって起動されるメソッドに長いプロセスを組み込むことは不可能だと思い始めています。
データを管理する別のスレッドを使用して回避しますが、問題は、ジョブが新しいスレッドに渡されると、MSMQがメッセージを削除したため、TransactionScopeの利点が失われることです。