2

私たちは bpm でプロセスをモデル化し、Spring 環境で camunda エンジンを使用してその bpm を実行しています。あるシナリオでは、2 つのユーザー タスクの間にカスタム Java コードを実行したいと考えています。camunda のドキュメントの多くを読んだ私の結論は、Service-Task の概念が最適であるということです。

私は2つのことをしたいと思います.1つはサービスタスクで複数のプロセス変数を保存することであり、2つは動的に定義することです.どのプロセス変数がService-Taskのどの入力パラメータにマップされるかです.

私の知る限り、Camunda は Java コードとサービス タスクを統合する 2 つの方法を提供しています。

1.) JavaDelegate インターフェースを実装する Spring-Bean を宣言します。(このメソッドは、パラメーターとして DelegateExecution を取得します)。これにより、結果変数を好きなだけ保存できますが、プロセス変数 -> 入力変数のマッピングを定義するオプションがありません。

2.) camunda からアクセスできる汎用 Spring Bean を宣言し、システム タスクによって実行されるその Bean のメソッドを定義します。これにより、bpm-definition を介してプロセス変数 -> 入力変数のパターンを指定できますが、最大で 1 つの結果変数を格納できます。

それで、両方を達成する方法はありますか?

明確化

私の要件を明確にするために、システムタスクが不整合な状態 (データベースまたはプロセス変数) を検出する場合があります。次のユーザー タスクがエラーを修正する機会を得られるように、タスクがプロセス変数にエラー コード (プログラム「exit(1)」のエラー コードと同様) を格納するようにしたいと考えています。このエラーコードは、プロセス変数の固定された場所に保存されることもありますが、指定された場所に少なくとも 1 つの「実際の結果」を配置できるようにしたいと考えています。

4

1 に答える 1

2

現在の実行を使用して変数を読み取り、更新するSpring Beanに動作を実装できるはずです。

myErrorHandler次のようなサービス タスクで指定された Spring Bean を配線します。

<serviceTask id="checkError"
             camunda:expression="#{myErrorHandler.checkError(execution)}" />

変数はデフォルトで式で使用でき、現在のプロセス変数にアクセスできるDelegateExecutionexecutionのインスタンスを指します。

Spring Bean の実装は次のようになります。

@Component
public class MyErrorHandler {

  /**
   * Actual error handler invoked as service
   */
  public void checkError(DelegateExecution execution) {

    execution.getVariables(); // Map<String, Object> of variables

    execution.setVariable("errorCode", 500); // update variable
  }
}
于 2013-10-15T12:09:03.067 に答える