Campaign Standardでは、ワークフローエンジンによって、1 つのプロセスのみで 1 つのワークフローインスタンスが実行されることが保証されます。 インポート、長時間実行されるクエリ、データベースへの書き込みなどのアクティビティをブロックすると、実行時に他のタスクが実行されなくなります。
一方、非ブロックアクティビティは、他のタスク ( 通常、 Scheduler アクティビティ )。
これにより、同じワークフローの以前の実行がまだ完了していない場合でも、スケジュールベースのワークフローの実行が開始し、予期しないデータの問題が発生する可能性があります。
したがって、複数のアクティビティを含むスケジュール済みワークフローをデザインする場合は、ワークフローが完了するまで再スケジュールされないようにする必要があります。 これをおこなうには、以前の実行の 1 つ以上のタスクがまだ保留中の場合に、実行を防ぐようにワークフローを設定する必要があります。
前回のワークフロー実行の 1 つ以上のタスクがまだ保留中かどうかを確認するには、 Query および Test アクティビティ。
を追加します。 Query アクティビティ Scheduler 「 」アクティビティを開き、次のように設定します。
アクティビティのリソースをに変更します。 WorkflowTaskDetailワークフローの現在のタスクをターゲットにします。
次のルールを使用してクエリを設定します。
最初のルールは、現在のタスク(クエリ 2)と、現在のワークフローに属する次のスケジュールタスク(スケジュール 2)を除外します。
When a Scheduler 「 」アクティビティが開始されると、すぐに別のスケジュールタスクが追加され、次のスケジュール時刻に実行され、ワークフローが開始されます。 したがって、前回の実行から保留中のタスクを検索する場合は、クエリとスケジュールタスクの両方をフィルタリングすることが重要です。
2 つ目のルールは、前回のワークフロー実行のタスクが、0 個の実行ステータスに対応する、アクティブ(保留中)であるかどうかを判定します。
を追加します。 Test アクティビティを使用して、 Query アクティビティ。 これをおこなうには、2 つのアウトバウンドトランジションを設定します。
これで、必要に応じて、残りのワークフローを設定できます。 保留中のタスクが原因でワークフローの実行がキャンセルされた場合、スケジュールに従ってワークフローが再度実行されると、以下の手順を実行できます。 これにより、前回の実行からアクティブな(保留中の)タスクがない場合にのみ、ワークフローの実行が続行されます。