2

ユーザーによって送信されたアプリケーションの状態を維持するためのステートマシンワークフローがあります。私が抱えている問題の1つは、ワークフローの終了に関連しています。ある州では、バグがありました。アプリケーションがその状態に達すると、例外がスローされ、その結果、ワークフローの終了イベントが呼び出され、特定のワークフローインスタンスが永続データベースから削除されました。そのため、そのワークフローインスタンスをロードできなくなりました。いずれかの状態でエラーが発生した場合、例外がスローされますが(問題が何であるかがわかるように)、ワークフローインスタンス全体が消えないようにする必要があります。フォールトハンドラーアクティビティは、ワークフローが終了しないことを保証できますか?また、終了イベントが呼び出されたときに、インスタンスが永続ストアから削除されない方法はありますか。

ヘルプ/提案をありがとう。

4

3 に答える 3

2

ワークフローで例外がスローされると、例外は、次のいずれかになるまで、アクティビティの祖先を介して効果的に「バブルアップ」します。

  1. フォールトハンドラーアクティビティによって処理されます
  2. ルートアクティビティ(つまり、ワークフロー自体)に到達し、その時点でワークフローが終了します。

考えられるすべての例外のフォールトハンドラーを適切な場所に作成することをお勧めします。フォールトハンドラーアクティビティを使用すると、ワークフローインスタンスを回復し、ステートマシンを終了させるのではなく、効果的に使用可能な状態に戻すことができます。

ワークフローが終了すると使用できなくなるため、終了が発生するとワークフローを永続ストアに保持するメリットはありません。そのため、ワークフローは削除されます。ご覧のとおり、重要なのは、予期せず終了するのを防ぐことです。

最後のヒント。ワークフローが終了すると、終了の原因となった例外が、WorkflowTerminatedEventArgsオブジェクトのExceptionプロパティとしてイベントリスナーに送信されます。それをキャッチしてどこかに出力するための何らかのロギングメカニズムを用意することを絶対にお勧めします。そうすれば、将来、何らかの理由でキャッチされないバグが発生した場合に、それらを追跡するのがはるかに簡単になります。

于 2010-11-12T16:00:44.460 に答える
0

ワークフローが実際に終了するのを防ぐカスタムSQLワークフロー永続化サービスを作成しました。これにより、エラーの原因となった遷移が発生する前に、ワークフローを以前の状態のままにします。

public class CustomSqlWorkflowPersistenceService : SqlWorkflowPersistenceService
    {
        public CustomSqlWorkflowPersistenceService (string connectionString) : base(connectionString)
        {
        }

        public CustomSqlWorkflowPersistenceService (NameValueCollection parameters) : base(parameters)
        {
        }

        public CustomSqlWorkflowPersistenceService (string connectionString, bool unloadOnIdle, TimeSpan instanceOwnershipDuration, TimeSpan loadingInterval) : base(connectionString, unloadOnIdle, instanceOwnershipDuration, loadingInterval)
        {
        }

        protected override void SaveWorkflowInstanceState(Activity rootActivity, bool unlock)
        {
            WorkflowStatus workflowStatus = GetWorkflowStatus(rootActivity);
            if (workflowStatus == WorkflowStatus.Terminated)
            {
                string workflowError = GetSuspendOrTerminateInfo(rootActivity);
                if (!string.IsNullOrEmpty(workflowError))
                {
                    string error = string.Format("Workflow terminated, forcing an abort! {0}", workflowError);
                    throw new Exception(error);
                }
            }
            base.SaveWorkflowInstanceState(rootActivity, unlock);
        }
    }

WFを強制的に終了させたい場合、これは明らかに苦痛になりますが、回避できると確信しています。

于 2011-01-31T22:56:39.207 に答える
0

私はSqlWorkflowPersistenceを使用しています。これを修正するために、以下を実行しました。

'WorkflowPersistence' DBには、インスタンスを削除するSP'InsertInstanceState'があります。インスタンスを削除するコードにコメントしました。

動作しているように見えますが、これが正しい方法かどうかはわかりません。

私が変更したSPの一部を以下に示します。

IF
@status=1 OR @status=3          
    BEGIN      

/* DELETE FROM [dbo].[InstanceState] WHERE uidInstanceID=@uidInstanceID AND ((ownerID = @ownerID AND ownedUntil>=@now) 
 OR (ownerID IS NULL AND @ownerID IS NULL ))          
*/
    END  
于 2016-04-22T16:46:07.517 に答える