2011-01-13 8 views
0

私は、メッセージングアクティビティを使用してワークフローを開始し、永続化しました。 Start initialコマンドとStop finalコマンドの間の相関関係は、数秒以内に送信されればうまく動作します。永続化されたワークフローの読み込み中にエラーが発生しました。

LoadWorkflowByInstanceKeyCommand.AssociateLookupKeyToInstanceIdが指定されていない場合、LookupInstanceKeyはすでにインスタンスに関連付けられている必要があります、またはLoadWorkflowByInstanceKeyCommandは失敗します。次のSTOPメッセージは、次のFaultExceptionをスローするためのワークフローは、無負荷のとき 問題が始まります。このため、AssociateLookupKeyToInstanceIdが設定されていない場合、LookupInstanceKeyをInstanceKeysToAssociateコレクションに指定することは無効です

誰かが私を助けることができますか? ワークフロー内の変数は、int型とXDocument型です。 これはWorkflowServiceHostを初期化するためのコードです:

WorkflowServiceHost serviceHost = new WorkflowServiceHost(myWorkflow, new Uri(serviceUri)); 
      ServiceDebugBehavior debug = serviceHost.Description.Behaviors.Find<ServiceDebugBehavior>(); 
      if (debug == null) 
      { 
       debug = new ServiceDebugBehavior(); 
       serviceHost.Description.Behaviors.Add(debug); 
      } 

      debug.IncludeExceptionDetailInFaults = true; 
      WorkflowIdleBehavior idle = serviceHost.Description.Behaviors.Find<WorkflowIdleBehavior>(); 
      if (idle == null) 
      { 
       idle = new WorkflowIdleBehavior(); 
       serviceHost.Description.Behaviors.Add(idle); 
      } 

      idle.TimeToPersist = TimeSpan.FromSeconds(2); 
      idle.TimeToUnload = TimeSpan.FromSeconds(10); 
      var behavior = new SqlWorkflowInstanceStoreBehavior 
      { 
       ConnectionString = ConfigurationManager.ConnectionStrings["WorkflowPersistence"].ConnectionString, 
       InstanceEncodingOption = InstanceEncodingOption.None, 
       InstanceCompletionAction = InstanceCompletionAction.DeleteAll, 
       InstanceLockedExceptionAction = InstanceLockedExceptionAction.BasicRetry, 
       HostLockRenewalPeriod = new TimeSpan(00, 00, 30), 
       RunnableInstancesDetectionPeriod = new TimeSpan(00, 00, 05) 
      }; 
      serviceHost.Description.Behaviors.Add(behavior); 
      serviceHost.Open(); 

は、データベースを見ると、ワークフローが中断されることはありませんようです。

すべてのヘルプ感謝、 はここで何が起こっているか

答えて

0

本当にわからないあなたに感謝しますがシリアライズしてディスクに保存されるからワークフローを防ぐことができないワークフローで使用されるタイプがあるようですね。 「データベースを見ると、ワークフローは決して中断されていないようです。」あなたは本当に中断しているのですか?そして、なぜあなたはワークフローが中断されることを期待していますか?

開始メッセージだけをワークフローに送信して2秒待つとどうなりますか?永続データベースに新しいレコードがありますか?

+0

一時停止の場合は、RunnableInstancesTableテーブルに移動し、InstanceTableテーブルのIsSuspended値が1に設定されていることを意味します。 遅延を追加すると正しく停止されるため、ワークフローをシリアル化できます。 問題は、WorkflowIdleBehavior.TimeToUnloadが経過した後に、ワークフローが中断されず、Stop操作の呼び出しによって前述のエラーがスローされることです。 TimeToUnloadタイムアウト前にStop操作を送信すると、エラーはスローされません。 これは長時間実行されるワークフローです。 – fra

+0

ワークフロー定義でエラーが発生し、Stop receiveアクティビティで相関初期化が繰り返されていることがわかりました。 とにかく、アイドリングされたワークフローがrunnableinstancestableにない理由を説明していただきたいと思います...とにかくデータベースにシリアル化され、メモリからアンロードされますか?どのポリシーが使用されていますか? – fra

+0

永続化されたワークフローはInstancesTableテーブルに格納され、RunnableInstancesTableはワークフローの復旧に使用されます。通常、ワークフローが永続化されている場合は中断されず、ポリシーがAbandonAndSuspendに設定されているとエラーが発生します。つまり、ワークフローは自動的に再開されませんが、手動で再開する必要があります。 – Maurice

関連する問題