0

次のコードでワークフローを再開しようとすると:

    public WorkflowApplication LoadInstance(Guid instanceId)
    {
        if (this.instances.ContainsKey(instanceId))
            return this.instances[instanceId];

        WorkflowApplication instance = new WorkflowApplication(new Tarpon.Workflows.CreateContact());

        //  Create Persistable Workflow           
        SqlWorkflowInstanceStore store = new SqlWorkflowInstanceStore(ConfigurationManager.ConnectionStrings["WorkflowPersistance"].ConnectionString);
        store.HostLockRenewalPeriod = new TimeSpan(0, 0, 5);
        instance.InstanceStore = store;

        //  Load Instance
        instance.Completed += OnWorkflowCompleted;
        instance.Idle += OnIdle;
        instance.PersistableIdle += OnIdleAndPersistable;
        instance.Aborted += OnAborted;
        instance.Load(instanceId);

        //  Save instance in list of running instances
        this.instances.Add(instance.Id, instance);       // ERROR IS THROWN HERE

        return instance;
    }

「 this.instances.Add(instance.Id, instance)」という行でエラーが発生します。

The execution of an InstancePersistenceCommand was interrupted because the instance '9b9430b6-f182-469d-bcae-0886d546f7ea' is locked by a different instance owner. 
This error usually occurs because a different host has the instance loaded. The instance owner ID of the owner or host with a lock on the instance is '30411662-b9b3-4250-9e2c-5aaa9895b740'.

上記のコードで HostLockRenewalPeriod を下げようとしましたが、インスタンスのロックを無効にするために以下のコードを追加しましたが、役に立ちませんでした。また、以下のコードに侵入することもないようです。Load() メソッドを通過するたびに、上記のエラーが発生します。

    public PersistableIdleAction OnIdleAndPersistable(WorkflowApplicationIdleEventArgs e)
    {
        instances.Remove(e.InstanceId);
        return PersistableIdleAction.Unload;
    }

このコードは半分の時間は機能するようですが、残りの半分はワークフローを正しく再開しません。この機能をすべて書き直さなくても、ロックを適切に削除するために私ができることについて何か手がかりを持っている人はいますか?

4

4 に答える 4

2

永続性と instaneStore 構成について説明しているこのブログ投稿をご覧ください。

このコードは投稿からコピーされたもので、役立つと思います:"

var instanceStore = new SqlWorkflowInstanceStore(connStr); 
var instanceHandle = instanceStore.CreateInstanceHandle();
var createOwnerCmd = new CreateWorkflowOwnerCommand();
var view = instanceStore.Execute(instanceHandle, createOwnerCmd, TimeSpan.FromSecond(30));
instanceStore.DefaultInstanceOwner = view.InstanceOwner; 
// Do whatever needs to be dome with multiple WorkflowApplications 
var deleteOwnerCmd = new    DeleteWorkflowOwnerCommand();
instanceStore.Execute(instanceHandle, deleteOwnerCmd, TimeSpan.FromSeconds(30));

重要なのは、最初に実行する必要がある CreateWorkflowOwnerCommand です。また、CreateWorkflowOwnerCommand を使用する場合は、DeleteWorkflowOwnerCommand を忘れないようにしてください。そうしないと、すべてのワークフローが所有者によってロックされたままになり、別の SqlWorkflowInstanceStore によって再読み込みできなくなります。

于 2012-09-13T10:05:17.630 に答える
0

WorkflowIdleBehaviorオブジェクトを作成TimeToUnloadしてゼロに設定してみてください。詳しくはこちらをご覧ください。

于 2012-06-17T01:52:36.860 に答える
0

instance.Runまたはここには表示されませんinstance.ResumeBookmark。PersistableIdle などの実行関連のイベントを発生させるには、これが必要です。

于 2012-05-24T21:52:46.077 に答える
0

実際、開発中にこのエラーが発生した場合は、永続化データベースを一掃する必要があることを意味しています。永続化されたワークフローを削除するために、既に存在するストアド プロシージャを使用してこれを行うことができます。

于 2012-06-04T11:51:27.493 に答える