4

複雑なワークフローで使用される一連のカスタム アクティビティがあります。

ワークフローをアイドル状態にすることなく、それら (カスタム アクティビティ) を永続化できるようにしたいと考えています。これは一種のフェイルオーバー システムである必要があるため、ワークフローの実行中に何か問題が発生すると、次のいずれかになります。

  • ユーザーによって (いつでも) 一時停止され、後で一時停止されたブックマーク/ポイントから再開された (たとえば、ユーザーが外部システムがダウンしていることに気づき、ワークフローを一時停止したい場合など)。
  • 未処理の例外が発生した場合は、最後のブックマーク/時点から実行を再開できます
  • WorkflowApplication ホストの停止はいつでも発生する可能性があり、最後のブックマーク/時点から実行を再開できます

ワークフローの永続化で数日間作業しましたが、それで目標を達成できるかどうかはわかりません。なんで?

  • 各カスタム アクティビティでブロック ブックマークを使用することもできますが、ワークフローをブロックして、ワークフローを永続化するためだけに再起動するのは、うまくいきそうにありません。
  • notblocking ブックマークを使用することはできましたが、それらをデータベースで確認して再開することはできませんでした。

アドバイスをお願いできますか?ワークフロー ブックマークはここに行く方法ですか?

ブックマークをブロックしないことにはいくらかの光が見えますが、ブックマークを永続化して後で再開することはできません。後で再開するためにノンブロッキング ブックマークを保持する方法を教えてください。

編集:

wf3 には、PersistOnClose私の要件に十分な属性がありました。wf4 ではアクティビティに置き換えられましたがPersist、これも役立つ可能性がありますが、すでに複雑なワークフローに余分なアクティビティを追加したくありません。

context.RequestPersist(callback)から実行できることが理想的ですが、NativeActivityContextこのメソッドは内部的なものです (そして、その内部にあるものはすべて、元のアセンブリの外部には表示されません。

4

2 に答える 2

3

これが私が持ってきたものです:

  • ノンブロッキング ブックマークはオプションではありません。非ブロッキング ブックマークは作成アクティビティの完了を妨げませんが、ワークフロー インスタンスがアイドル状態になることもありません。つまり、永続化されません。非ブロッキング ブックマークは、(それを作成した) アクティビティが完了すると破棄されます。このブックマークは、アクティビティの作成が完了していない場合にのみ再開できます。
  • PersistOnCloseAttribute私は WF4 を使用しており、この属性は .NET 3.x WF のみであるため、使用はオプションではありません。
  • ブロック ブックマークは、望ましくないワークフローの実行をブロックするため、使用できません。

Persist解決策は、カスタムメイドの各アクティビティでアクティビティを使用することです(NativeActivity子アクティビティをスケジュールできるように拡張する必要があります):

//class field
Activity childActivity = new Persist();

これを機能させるには、ImplmentationChild としてメタデータに追加する必要があります。

protected override void CacheMetadata(NativeActivityMetadata metadata)
{
     base.CacheMetadata(metadata);
     metadata.AddImplementationChild(this.childActivity);
}

最後に、子アクティビティを Execute メソッドからスケジュールします (どこでも問題ありません。永続化は、アクティビティの呼び出しが完了した後にのみ行われます*)。

protected override void Execute(NativeActivityContext context)
{
    //...
    context.ScheduleActivity((Activity)this.childActivity);
}

未処理の例外の後もワークフローを維持するには、次のコードを WorkflowApplication に追加する必要があります。

 application.OnUnhandledException = delegate(WorkflowApplicationUnhandledExceptionEventArgs e)
 {
      return UnhandledExceptionAction.Abort;
 };

* メソッドからの戻りは、Execute必ずしもアクティビティが「完了」したことを意味するわけではありません。つまり、アクティビティ内にブロッキング ブックマークがあります (以下の欠点を参照)。

このソリューションにはいくつかの欠点があります。

  • ソリューションは、ワークフローの状態を 1 つだけ保持します (最後の状態)。
  • 永続性は、アクティビティが完了したときにのみ発生します。つまり、アクティビティの途中から永続化/再開を行うことはできません。
  • 並列ループ/シーケンスでは機能しません。並列ループ/シーケンスからのアクティビティは、並列処理全体が完了した後も保持されます。通常のループ/シーケンスで正しく動作します。
  • ブロック ブックマークは、このソリューションに大きな影響を与えます (作成アクティビティまたは作成アクティビティの他の子アクティビティで作成された場合)。Execute メソッドが返されても、アクティビティが完了しない原因となります。最終的に Persist が実行されます (アクティビティの完了後またはアイドル状態になる前のいずれか)。
于 2015-08-12T07:48:30.193 に答える
0

あなたの質問が正しく理解できれば、以下の要件があります。

  1. ワークフローの持続性と回復。
  2. ユーザーは一時停止および再開できます。
  3. 例外が発生した場合、ワークフローは持続し、次のアクティビティから再開されます。

以下の手順を使用してアプローチできます。

  1. WF + WCF サービスを使用して、ワークフローを実行およびホストできます。
  2. Oracleを使用している場合は、Sqlサーバーのようなデータベースで永続性と追跡を追加し、Devartを使用できます.
  3. ControlEnpont を一時停止および再開するように構成します。
  4. 例外を処理するには、try/Catch と永続化アクティビティを賢く使用してください。

問題やカスタマイズが必要な場合は、同じように説明してください.:) 私はあなたのようなワークフローを開発しました。

于 2015-06-14T11:18:13.490 に答える