IIS でホストされ、AppFabric 1.1 を使用する WCF Windows ワークフロー (4.5) ワークフロー サービスがあります。ワークフロー インスタンスは長時間 (最大約 1 週間) 実行されますが、多くの時間は遅延アクティビティに費やされます。
これは最初は問題なく動作するように見えましたが、ワークフローの複数のインスタンスを同時に実行すると (インスタンスが 2 つ以上あるとこの問題が発生します)、遅延ステップ中にメモリからアンロードされると、一部のインスタンスが起動しません。ログを見ると、見つかったエラーはすべて次のようになります。
System.OperationCanceledException: The execution of InstancePersistenceCommands has been canceled because the InstanceHandle was freed.
at System.Runtime.AsyncResult.End[TAsyncResult](IAsyncResult result)
at System.ServiceModel.Activities.Dispatcher.DurableInstanceManager.WaitAndHandleStoreEventsCallback(IAsyncResult result)
残念ながら、そのエラー メッセージに関する有益な情報は見つかりません。
AppFabric Persisted Instances テーブルの SuspensionExceptionName および SuspensionReason フィールドは、System.NullReferenceException: オブジェクト参照がオブジェクトのインスタンスに設定されていないことを示しています。しかし、これはワークフロー内では発生せず、外部でのみ発生します。
追加情報:
- Fire & Forget としてアクティビティを実行しています (受信アクティビティ、送信なし)
- 私のワークフローは、データを取得するために他の WCF サービスを呼び出します。
- これをServer 2012 R2、IIS 8(Azureではない)で実行しています
- ワークフローの持続性が機能しています。IIS をリセットして再起動できます... 2 つのインスタンスを実行したときに問題が発生しました。
- 私は間違いなく、いかなる種類のスロットリング制限にも達していません。ワークフローは数 MB のデータを処理しますが、この問題は 2 つ以上のインスタンスで発生します。
ここで何が起こっているのでしょうか?
編集:問題がどのように機能するかについてより多くの情報を見つけ、それを質問に追加しなかったことに気付きました。遅延の問題が発生すると、静的変数が 2 つのスレッドによって書き込まれるように動作します。
視覚化は次のとおりです。
WF1 Start ---->Do Stuff--->Sleep------------*1----->Cancelled Exception at some point
------WF 2 Start---->Do Stuff------->Sleep->Wake up---------*2------>More Stuff---->End Successfully
*1 - When WF Instance 1 Should Wake up (Same time as WF 2 wakes)
*2 - When WF Instance 2 Should have woken up (Seems to be ignored)
誰かが尋ねる前に...コード内のすべての静的変数、メソッド、クラスを取り除きました。もう何も静的ではありません。