どう処理し、中断するか並列ワークフロータスクを中断する


Thu 10 November 2016 作成者: Josh Fletcher

概要

Nuxeoワークフローエンジンは並列タスクをサポートします。実際に、並列タスクを含むデフォルトのワークフローは、コアプラットフォームで提供されます。並列タスクは、ユーザが互いに待つことなくタスクを完了できるようにすることで、ユーザの生産性を向上させる優れた方法です。

しかしながら、ワークフロータスクを「中断する」ことができる共通の必要性があります。それは、タスク中に分岐して別のパスを選択できるようにしなければならないということです。タスクの分岐はシリアルタスクでは簡単です。必要な移行(および移行の条件)を定義するだけで済みます。

通常、ワークフローエンジンは、すべての参加者がタスクを完了するまで決定することはありません。ワークフローエンジンは、すべてのタスクが完了するまで待機し、結果に基づいて移行を選択します。今日は、もう少し詳しく並列ワークフロータスクを中断する方法を見てみましょう。

概要

「並列タスク」は、Nuxeo Studioの「マルチタスク」というラベルの、別のノードタイプです。

Tasks

マルチタスクノードの設定は、他のノードの設定と同じです。他のノードと同様に、変数、フォーム、移行、エスカレーションルールがあります。主な違いは、ワークフローエンジンがこのタイプのノードに遭遇すると、割当先のそれぞれに対して別々のタスクを作成することです。デフォルトでは、すべてのタスクが完了するまで移行は選択されません。

使用事例

ワークフローで「レビュー」または「承認」のステップがある場合、絶対に受け入れられないものがあれば、すぐに作成者に文書を返送することができます。この場合、他の割当先が文書を承認するのを待つ理由はありません。私はすでにそれを改訂する必要があることを知っているからです。

この使用事例を確認するもう一つの方法は、「スーパーユーザ」に自らの裁量で並列タスクを中断する能力を与えることです。

ワークフロー

次は、簡単なワークフローを示す実例です。

Workflow

この場合、任意のユーザが拒否ボタンをクリックした場合、「拒否」移行に従います。

タスクの中断

これを可能にする重要な項目がいくつかあります。

  • 「拒否」のために自動的に移行する
  • 並列タスクを排他ノードにする
  • ユーザが拒否を実行したときのエスカレーションルールを作成する
  • オートメーションチェーンを作成して、ワークフローエンジンにタスクを評価させる

自動的移行

自動的移行には、条件を「true(真)」に設定しておくだけで充分です。

Automatic Transition

排他ノード

タスクを排他ノードにするには、タスクの[移行]タブのチェックボックスをオンにします。

Exclusive Node

ワークフローエンジンが排他ノードを実行すると、移行を1つずつ評価し、移行の1つが真と評価されるとすぐに停止します。つまり、「拒否」移行は、他のすべてが失敗した場合にのみ使用されます。

エスカレーションルール

ユーザが「拒否」ボタンをクリックすると、エスカレーションルールが発生するはずです。条件は「通常の」移行と同じです。例:

NodeVariables["button"]=="reject"

このエスカレーションルールで使用されるオートメーションチェーンによって、ワークフローエンジンはWorkflow.ResumeNodeコマンドによる移行を再評価します。

- Context.FetchDocument
- Workflow.ResumeNode: {}

チェーンが実行されると、ワークフローエンジンはタスクの可能な移行を評価します。ここで、「承認」移行の条件に触れておくことは意味があります。

@{NodeVariables["tasks"].getNumberEndedWithStatus("to_FinalReview")==NodeVariables["numberOfProcessedTasks"]}

未処理のタスクが不完全な場合、この条件は「false(偽)」と評価され、排他ノードであるため、ワークフローエンジンは、自動的「拒否」移行に従います。

お役立ち情報:このプロセス中にライフサイクルの状態が変更された場合、この動作の有効なライフサイクル移行を宣言することを忘れないでください。

ボーナス:比例タスクの解決

並列タスクにおける移行の条件を調整することで、興味深い結果を得ることができます。例えば、割当先の少なくとも半数が「NotLiable」アクションを選択した場合、どのように移行するのでしょうか?次の説明をご覧ください。

@{NodeVariables["tasks"].getNumberEndedWithStatus("NotLiable") / NodeVariables["numberOfProcessedTasks"]>0.5}

タスクを中断するのではなく、この表現は「投票」システムをサポートします。参加者の半数以上が「NotLiable」移行を選択した場合にのみ真と評価されます。また、排他ノードがない場合でも、同じタスクから複数の移行を続けることができます。

まとめ

Nuxeoのワークフローエンジンは、信じられないほど柔軟性があります。「私は全員の時間を無駄にしたくないので、タスクを拒否できるようにしたいです」といった、当然ともいえる顧客の要求を受け取り、それを設定で直接モデル化することができるのは、本当に素晴らしいことです。

実行時にも、特定の動作にロックされることはありません。このエンジンは、ワークフローの経路を変更するためのオプションが非常に多いため、現代のビジネスプロセスをサポートし、デジタルトランスフォーメーションを実現することができます。


タグ付き: Workflow, Nuxeo Studio