2009-07-29 11 views
2

ASP.NETフォームの送信によってワークフローが開始されるため、WebランタイムでホストされているSQL永続性を使用するWindows Workflowインスタンスがあります。それは時間の偉大ほとんどを実行しますが、私は物事をキックする必要がありインスタンスを気づいた:Windowsワークフロー:なぜ永続性に苦しむのですか?

私はnextTimerも時間によって、道延滞行ってきました気づきます。場合によっては、ownerIDフィールドとownedUntilフィールドが永続データベース内でnullになることがあります。 「ロックされていない」と「ブロックされた」フィールドは常に両方とも「1」です。

...そして、私は彼らが移入している場合は、「所有者」フィールドをゼロとリサイクルでアプリケーションプールを蹴るまで、ワークフローランタイムはバックアップそれを選ぶせず、物事はその後うまく一緒に行きますほとんどの場合、エラーはありません(私はすべてのブロックをキャッチし、トレースファイルにキャッチしたものを書き出します)。そうではありません。持続性の原因となっ

遅延活動は、すべて1分に設定、およびランタイムの所有権の期間は、同様に60秒でされています。それに固執するコードは、常に1分以内に取る必要があります。

私はこれを書いているように、アプリケーションプール/アプリケーションドメインのリサイクルが原因であるのか不思議です...ワークフローがランタイムでどのメソッドを呼び出そうとしても、アプリケーションドメイン/プールをスピンアップしています60秒の所有期間にわたってリークする可能性があります。その音は遠隔的に説得力があり、それが正しく再水和しない原因になりますか?

その側線がなければ、私が見ているこの動作を引き起こす可能性が?私は、ワークフローを奪い取って毎日ランタイムをベビーシッターしたくありません。

答えて

7

非常にアプリドメインのリサイクルが問題の大きな部分を占める可能性が高いです。 IISは、最後の要求が終了するとすぐにAppDomainをリサイクルします。ただし、その要求の一部として別のスレッドで実行されているコードは見られません。これは、IISでホスティングするときにManualWorkflowSchedulerServiceを使用する主な理由の1つです。しかし、アクティブタイマーオプションを使用すると、バックグラウンドスレッドを使用してワークフローアクティビティを実行します。

また、ワークフローがアイドルになるとすぐにアンロードするようにしてください。これを行う最も簡単な方法は、SqlWorkflowPersistenceServiceのUnloadOnIdle設定を使用することです。期限切れの所有権を持つワークフローのが、唯一の起動時

PersistenceServiceチェック。したがって、ほとんどの場合、IISワーカープロセスを再起動すると、余分な作業をすることなく古いワークフローが再開されます。しかし、これは新しい問題の場合です。.....古い所有権をクリアするだけでも、このトリックを行うべきです。その場合、PersistenceServiceは次回にワークフローをリロードするだけです。唯一のトリックは、どのrunitme IDが古いかを知ることです(値を保持するプロパティはpublicではありません)。

もう1つのことは、IISワーカープロセスがリロードされていることです。これが行われなければ、WFランタイムがないので、期限切れのタイマーをチェックすることはできません。これは、あなたがこれをカバーしているように思えます。

+0

優れた執筆、私は明日できるだけ多くを試してみて、報告する。 – Chris

+1

それは、地面の多くをカバーしたため、受け入れられたとマークされ、情報のおかげで!それは所有時間だった。私はinstanceOwnershipDurationを上げて、ロードされたすべてのアクティビティに対して何をしようとしていたのかを完全に実行できるようにしました。 – Chris

1

dbとwebサーバー(同じサーバーでない場合)で時計を確認しましたか?以前はワークフローで同様の問題を抱えていましたが、根本的な原因はdbとWebサーバーのクロックが同期していないことでした。

+0

私はそれを考えなかったが、チェックして、2番目のものと同期している。しかし、良いアイデア、ありがとう! – Chris

2

ワークフローインスタンスが実行時にロックされている(したがって複数のワークフローランタイムは、インスタンスの両方によって処理されることなく、データベースを共有することができます)。AppDomainがリサイクルすると、ランタイムは、インスタンスはこれは冗長であるかもしれない

ロックが解除させ、停止されなければならない、私はそれをチェックしませんでしたが、それはワークフローインスタンスのロックを解除して助けた:

AppDomain.CurrentDomain.DomainUnload += ((sender, args) => 
              { 
               if (_runtime.IsStarted) 
                _runtime.StopRuntime(); 
              }); 
AppDomain.CurrentDomain.ProcessExit += ((sender, args) => 
              { 
               if (_runtime.IsStarted) 
                _runtime.StopRuntime(); 
              }); 
+1

global.asaxの "Application_End"関数で何か似たようなことをして、ランタイムを停止しました。私たちのアプローチは同じことをする2つの方法ですか?上記の呼び出しは使用しないでください。入力をありがとう、+1! – Chris

関連する問題