Mule SDK を使用したルーターの作成

概念上、ルーターは多くの実行可能なルートと一連のパラメーター (1 つルートまたはすべてのルートの実行を処理するパラメーター、あるいはどのルートの実行も処理しないパラメーター) を受け取ることができる​操作​です。

複数の実行パスの候補を受け取る場合、ルートを使用する必要があります。ルートのパラメーターを使用すると、含まれているプロセッサーを実行する必要があるかどうかを判断できます。ステレオタイプは、含まれているチェーンのステレオタイプを定義するためにルートの宣言で使用できます。要素の DSL コンテンツには、パラメーター化された​操作​が含まれないため、ルートでは複雑なパラメーターをインラインで定義できません。

ルートの定義

まず、​Route​ 基本クラスを拡張して、モジュールで 1 つ以上のルートを宣言する必要があります。

public class WhenRoute extends Route {

  @Parameter
  @Optional
  private boolean shouldExecute;

  public boolean shouldExecute() {
    return shouldExecute;
  }

}

ルーターの宣言

次に、いずれかのモジュールの​操作​として、ルーターメソッドを宣言します。​RouterCompletionCallback​ と共に 1 つ以上の ​Route​ 実装を受け取る操作は、ルーターとして登録されます。

@Extension(name = "Docs")
@Operations(ChoiceRouter.class)
public class DocsModule {

}

ChoiceRouter​ クラスは、次のメソッドを定義します。

public void choice(WhenRoute when,
                   @Optional OtherwiseRoute otherwise,
                   RouterCompletionCallback callback) {

  if (when.shouldExecute()) {
    when.getChain().process(callback::success, (error, previous) -> callback.error(error));

  } else if (otherwise != null && otherwise.shouldExecute()) {
    otherwise.getChain().process(callback::success, (e, r) -> callback.error(e));

  } else {
    callback.success(Result.builder().build());
  }
}

上記では、ルーターの宣言方法と、設定に基づいてどのようにルートが実行されるのかがわかります。ルートの実行は、各ルート自体がスコープであるかのようにチェーンを介して行われます。

ルーターを使用するには、ルーターパラメーターを設定して、その独自のパラメーターで各ルート宣言を追加します。

<flow name="logDecoratorSampleFlow">
    <docs:choice>
      <docs:when shouldExecute="#[payload != null]">
        <http:request config-ref="config" path="/" method="GET"/>
      </docs:when>
      <docs:otherwise>
        <logger message="Payload was null"/>
      </docs:otherwise>
    </docs:choice>
</flow>

これにより、​payload​ が null でないたびに ​when​ ルートに含まれている ​http:request​ 操作が実行されます。null の ​payload​ が到達すると、代替の ​otherwise​ が実行されます。

Void ルーター

バージョン 1.1 以降で使用可能

実行の終了時に実行前と同じイベントやメッセージを残すルーターを作成することが必要になる場合もあります。この種のルーターは、Void ルーターと呼ばれます。

Void ルーターを実装するには、メソッドに ​RouterCompletionCallback​ ではなく ​VoidCompletionCallback​ 型の引数が必要です。このコールバックは、以前と同じように (​success​ および ​error​ メソッドで) 使用します。ただし、このケースでは ​success​ でどのパラメーターも受け取りません。

制限

次の制限が適用されます。

設定と接続には非対応

ルーターには、​操作​とは異なる制限があります。定義上、ルーターは特定の設定や接続に依存したり、それらを受け取ったりすることはできません。

常に非ブロック

すべてのルーターは、その結果を伝えるために ​RouterCompletionCallback​ を受け取る ​void​ メソッドとして定義されている必要があります。つまり、すべてのルーターはデフォルトで非ブロックになります。