0

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)

誰かが尋ねる前に...コード内のすべての静的変数、メソッド、クラスを取り除きました。もう何も静的ではありません。

4

2 に答える 2

1

私はかなり長い間、同様の問題に苦しんできました。私は WFW4 を使用していますが、ワークフロー インスタンスが長時間遅延しているときに同様のエラーが発生します。

問題の原因はわかりませんが、役立つ回避策があります。

私の場合、エラーはワークフロー管理サービスからのもので、「net.pipe://.svc」でサービス管理エンドポイントを呼び出してサービス「/Alerts/Workflows/.xamlx」をアクティブ化できませんでした。例外: 「アクセスが拒否されました。」

これらのエラーは、インスタンスが長い遅延に入ってから 6 時間から 30 時間の間に発生し始めます。

最初のインスタンスが遅延してエラーが発生しているときにワークフローの新しいインスタンスを作成すると、ワークフロー管理サービスは最初のスリープ状態のインスタンスとのやり取りを再開できることがわかりました。

そこで、長い遅延を含むワークフローのインスタンスを定期的に起動してから強制終了することを唯一の目的とする新しいワークフローを作成しました。

実際には、これを機能させるにはもう少し複雑になります。この新しいワークフローも、最初のワークフローの新しいインスタンスを作成して終了する間にスリープ状態になるようにしたかったのです。しかし、これがスリープ状態になると、新しいワークフローのインスタンスが最初のワークフローと同じ問題に悩まされます。そこで、新しいワークフローを次のように変更しました。 -- 30 分間など、かなり短い期間だけ遅延させます -- 最初のワークフローのインスタンスを作成します -- 1 分待ちます -- 作成したばかりのワークフローのインスタンスを強制終了します最初のワークフロー -- この新しいエラー防止ワークフローの新しいインスタンスを作成します -- 終了します

これを行ってから、ワークフロー管理サービスから Access is Denied エラーが発生しなくなりました!

お役に立てれば

于 2015-04-02T16:59:53.350 に答える