3

ワークフローを実行している Windows サービスがあります。ワークフローはデータベースから読み込まれた XAML です (ユーザーは再ホストされたデザイナーを使用して独自のワークフローを定義できます)。アイドル状態になったときにワークフローを永続化するために、SQLWorkflowInstanceStore の 1 つのインスタンスで構成されます。(これは基本的に、Microsoft の WCF/WF サンプルの \ControllingWorkflowApplications のサンプル コードから派生したものです)。

しかし、時々私は以下のようなエラーを受け取ります:

System.Runtime.DurableInstancing.InstanceOwnerException: 所有者 ID 'a426269a-be53-44e1-8580-4d0c396842e8' のインスタンス所有者登録が無効になったため、InstancePersistenceCommand の実行が中断されました。このエラーは、この所有者によってロックされたすべてのインスタンスのメモリ内コピーが古くなり、InstanceHandles と共に破棄する必要があることを示しています。通常、このエラーはホストを再起動することで処理するのが最適です。

原因を突き止めようとしましたが、開発環境で再現するのは難しく、実稼働サーバーではたまに発生します。私が見つけた 1 つのヒント: LockOwnersTable を見ると、LockOnwersTable lockexpiration が 01/01/2000 0:0:0 に設定されていて、もう更新されていませんが、通常の状況では x 秒ごとに更新する必要があります。ホストロックの更新期間...

では、SQLWorkflowInstanceStore がこの LockExpiration の更新を停止するのはなぜですか? また、その原因を検出するにはどうすればよいでしょうか?

4

3 に答える 3

1

これは、バックグラウンドで実行されているプロシージャがあり、インスタンス ストアのロックを 30 秒ごとに拡張しようとしているために発生します。接続が SQL サービスへの接続に失敗すると、このインスタンス ストアが無効としてマークされるようです。[LockOwnersTable] テーブルからインスタンス ストア レコードを削除すると、同じ動作を確認できます。提案された解決策は、この例外が発生したときに、古いインスタンス ストアを解放して新しいインスタンス ストアを初期化する必要があることです。

public class WorkflowInstanceStore : IWorkflowInstanceStore, IDisposable
{
    public WorkflowInstanceStore(string connectionString)
    {
        _instanceStore = new SqlWorkflowInstanceStore(connectionString);

        InstanceHandle handle = _instanceStore.CreateInstanceHandle();
        InstanceView view = _instanceStore.Execute(handle, 
            new CreateWorkflowOwnerCommand(), TimeSpan.FromSeconds(30));
        handle.Free();

        _instanceStore.DefaultInstanceOwner = view.InstanceOwner;
    }

    public InstanceStore Store
    {
        get { return _instanceStore; }
    }

    public void Dispose()
    {
        if (null != _instanceStore)
        {
            var deleteOwner = new DeleteWorkflowOwnerCommand();
            InstanceHandle handle = _instanceStore.CreateInstanceHandle();
            _instanceStore.Execute(handle, deleteOwner, TimeSpan.FromSeconds(10));
            handle.Free();
        }
    }

    private InstanceStore _instanceStore;
}

このリンクでインスタンス ストア ハンドルを作成するためのベスト プラクティスを見つけることができます。 ワークフロー インスタンス ストアのベスト プラクティス

于 2015-09-08T09:04:58.453 に答える
0

所有者ユーザーの有効期限について確認する必要があります

ここで、この問題を処理するために私がどのように慣れているか

     public SqlWorkflowInstanceStore SetupSqlpersistenceStore()
    {
        SqlWorkflowInstanceStore sqlWFInstanceStore = new SqlWorkflowInstanceStore(ConfigurationManager.ConnectionStrings["DB_WWFConnectionString"].ConnectionString);
        sqlWFInstanceStore.InstanceCompletionAction = InstanceCompletionAction.DeleteAll;
        InstanceHandle handle = sqlWFInstanceStore.CreateInstanceHandle();
        InstanceView view = sqlWFInstanceStore.Execute(handle, new CreateWorkflowOwnerCommand(), TimeSpan.FromSeconds(30));
        handle.Free();
        sqlWFInstanceStore.DefaultInstanceOwner = view.InstanceOwner;
        return sqlWFInstanceStore;
    }

ここで、このメソッドの使用方法

     wfApp.InstanceStore = SetupSqlpersistenceStore();

この助けを望みます

于 2013-05-28T15:11:44.517 に答える