スケジュールされたワークフローの重複実行 preventing-overlapping-execution-of-scheduled-workflows
スケジュールされたワークフローの実行について
これにCampaign Standardして、ワークフローエンジンは、ワークフローインスタンスが 1 つのプロセスによってのみ実行されることを保証します。 インポート、長時間実行されているクエリ、データベースへの書き込みなどのアクティビティをブロックすると、実行中に他のタスクを実行できなくなります。
一方、ノンブロッキングアクティビティでは、他のタスク(通常は Scheduler アクティビティなどのイベントを待機しているアクティビティ)の実行はブロックされません。
これにより、同じワークフローの以前の実行がまだ終了していない場合でも、スケジュールベースのワークフローの実行が開始され、予期しないデータの問題が発生する可能性があります。
したがって、複数のアクティビティを含むスケジュール済みワークフローを設計する場合、ワークフローが完了するまでスケジュールを再設定しないようにする必要があります。 これを行うには、以前の実行の 1 つ以上のタスクがまだ保留中の場合に実行を防ぐために、ワークフローを設定する必要があります。
ワークフローの設定
以前のワークフロー実行で作成した 1 つ以上のタスクがまだ保留中かどうかを確認するには、Query と Test アクティビティを使用する必要があります。
-
Query アクティビティを Scheduler アクティビティの後に追加してから、次のように設定してください。
-
アクティビティのリソースを WorkflowTaskDetail に変更します。つまり、ワークフローの現在のタスクをターゲットにします。
-
以下のルールでクエリを設定します。
-
最初のルールでは、現在のタスク(query2)と、現在のワークフローに属する次のスケジュールタスク(schedule2)が除外されます。
note note NOTE Scheduler アクティビティが開始されると、直ちに別のスケジュールタスクを追加して、次のスケジュールされた時間に実行し、ワークフローを開始します。 したがって、以前の実行で保留中のタスクを検索する際は、クエリとスケジュールの両方のタスクをフィルタリングすることが重要です。 -
2 つ目のルールは、ワークフローの以前の実行で作成されたタスクがまだアクティブ(保留中)かどうかを決定します。これは、実行ステータス 0 に対応します。
-
-
Test アクティビティを追加して、Query アクティビティから返される保留中のタスクの数を確認します。 これを行うには、2 つのアウトバウンドトランジションを設定します。
- 保留中のタスクがない場合、最初のトランジションはワークフローの実行を続行します。
- 保留中のタスクがある場合、2 番目のトランジションではワークフローの実行がキャンセルされます。
必要に応じて、残りのワークフローを設定できるようになりました。 タスクが保留中であるためにワークフローの実行がキャンセルされた場合、ワークフローがスケジュールに従って再度実行されると、次の手順を実行する可能性があります。 これにより、以前の実行からアクティブな(保留中の)タスクがない場合にのみ、ワークフローの実行が続行されます。