メソッドの呼び出し - Mule 4

Java メソッド (インスタンスまたは静的) は、Java Module の ​invoke​ および ​invoke static​ 操作を使用してコールできます。それらの戻り値は、出力メッセージのペイロードに内に置かれるか、​対象変数​に保存できます。

Java Invoke 操作の設定可能なパラメーターの詳細な説明は、​「Java Module リファレンス」の「操作」セクション​を参照してください。

インスタンスメソッドの呼び出し

次の Java クラス ​TaxCalculator​ は ​com.me​ パッケージに属しています。

package com.me;

public class TaxCalculator {

    private Double percentBaseTax = 7.0;

    public Double calculateTax(Double price, Integer percentAdditionalTax) {
        return price * (this.percentBaseTax + percentAdditionalTax) / 100;
    }

    public Boolean isTaxFree(Double price) {
        if (price < 10) {
            return true;
        }
        return false;
    }
}

Java Module で使用されるクラスがデフォルトパッケージに属していない場合、クラスをエクスポートする必要があります。それ以外の場合、実行に失敗し、JAVA:CLASS_NOT_FOUND​ エラーが表示されます。​「リソースのエクスポート方法」​を参照してください。

インスタンスメソッドを呼び出す手順は、次のとおりです。

  1. Java Module の ​New 操作​を使用して、後でメソッドを呼び出すオブジェクトを作成します。これにより、インスタンス化されたオブジェクトが提供され、そのメソッドの 1 つをコールできます。

  2. invoke​ 操作をオブジェクトのいずれかのメソッドをコールするように設定します。​new​ 操作と同様、​invoke​ は入力パラメーターのマップを取り (メソッドに存在する場合)、​対象パラメーター​をサポートします。

次の例では、​TaxCalculator​ クラスのインスタンスが作成され、​taxCalculator​ 対象変数内に置かれます。次に、​price​ と ​percentAdditionalTax​ を引数として取る ​calculateTax(Double, Integer)​ メソッドがコールされ、その戻り値が ​totalTax​ 変数内に置かれます。

<java:new class="com.me.TaxCalculator"
	constructor="TaxCalculator()"
	target="taxCalculator"/>

<java:invoke instance="#[vars.taxCalculator]"
  class="com.me.TaxCalculator"
  method="calculateTax(Double, Integer)"
  target="totalTax">
      <java:args>#[{
        price: 25.5,
        percentAdditionalTax: 2
      }]</java:args>
</java:invoke>

メソッドのパラメーターでは、​constructor="Person(java.lang.Double, java.lang.Integer)"​ などの完全なパッケージ名を指定できます。これは必要ありませんが、コードをより明確にしたり、Java コードに競合するクラス名がある場合に役立ちます。

Anypoint Studio では、Java Module は ​invoke​ 操作で DataSense をサポートしています。DataSense は入力引数と出力値の両方のメタデータを提供します。

この例では、DataSense は ​calculateTax​ が ​Number​ を返すことを検出するため、​invoke​ 操作の出力メタデータは次のようになります。

invoke output metadata

Studio で ​invoke​ を使用する完全な例については、「​Studio での New 操作および Invoke 操作​」を参照してください。

args​ パラメーターにコンストラクターの引数を設定する場合は、マップのキーでパラメーターがコンストラクターに渡される方法を判断します。

パラメーターを名前 (​price​、​percentAdditionalTax​ など) で参照するには、 -parameters​ コンパイラーフラグを使用して、メソッドまたはコンストラクターを含む Java クラスをコンパイルする必要があります。 クラスがこのフラグを使用してコンパイルされていない場合は、同じパラメーターが宣言された順序と ​arg0​、​arg1​ のような正規名で参照されます。

この場合は次のようになります。

<java:args>#[{
  arg0: 25.5,
  arg1: 2
}]</java:args>

Java クラスが Studio プロジェクトで定義されている場合、​-parameters​ フラグを使用して Java クラスをコンパイルするように Maven コンパイラープラグインを ​pom.xml​ で設定する必要があります。

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.8.1</version>
    <configuration>
        <compilerArgs>
            <arg>-parameters</arg>
        </compilerArgs>
    </configuration>
</plugin>

DataWeave を使用したメソッドの呼び出し

Java Module には、​invoke​ 操作と同じ機能を DataWeave 式内で提供する DataWeave 関数 (​Java::invoke​) もあります。この手法は、​boolean​ 値を返すメソッドで特に役立ちます。この関数は、オブジェクトの完全なクラス名、実行するインスタンスメソッド、インスタンス化されたオブジェクトを引数として取り、メソッドの引数をマップとして取ります。

インスタンスメソッドの呼び出し​の Java クラスでは、この例は ​TaxCalculator​ の新しいインスタンスを作成し、Java Module の ​invoke​ 操作を使用して ​isTaxFree(Double)​ メソッドをコールする代わりに、​Choice​ コンポーネントに DataWeave 関数を埋め込みます。

<java:new class="com.foo.TaxCalculator"
	constructor="TaxCalculator()"
	target="taxCalculator"/>

<choice>
    <when
      expression="#[Java::invoke('com.foo.TaxCalculator', 'isTaxFree(Double)', vars.taxCalculator, {price: vars.price})]">
        <flow-ref name="skipTax" />
    </when>
</choice>

静的メソッドの呼び出し

静的 Java メソッドを呼び出す方法の例を次に示します。

<java:invoke-static
	class="java.lang.Math"
	method="toRadians(double)">
    <java:args>#[{
        arg0: 180
    }]</java:args>
</java:invoke-static>

Studio での New 操作および Invoke 操作

Anypoint Studio では、Java パッケージをプロジェクトに書き込みまたは読み込み、1 つ以上のフロー内で Java 操作を設定してから、その操作が存在する Mule アプリケーションを実行できます。

Java Module の例

この例では、Mule アプリケーションに 2 つのフローをセットアップします。

  1. 小さな Java パッケージ (​com.examples​) を記述します。

  2. インスタンスメソッド (​Hello.java​ と ​Add.java​) を含む 2 つのシンプルな Java クラスを記述します。

  3. Apache Maven コンパイラープラグインを使用して、​arg0​、​arg1​ などではなく、設定で名前付きパラメーターを使用できる方法でクラスをコンパイルします。

  4. Java Module の ​New​ 操作を使用して、​Hello​ と ​Add​ オブジェクトをインスタンス化し、インスタンスメソッド内の名前付きパラメーターにアクセスします。

  5. Java Module の ​Invoke​ 操作を使用して、​hello()​ と ​add(3,4)​ インスタンスメソッドを呼び出します。

  6. Mule アプリケーションを実行して、Studio で ​New​ 操作と ​Invoke​ 操作を実行します。

次のような 2 つのシンプルな Java クラスでメソッドを呼び出すとします。

インスタンスメソッドのある Hello クラス
package com.examples;

public class Hello {

  //Constructor
  public Hello() { }

  //Instance method: hello()
  //Returns the string "helloWorld".
  public String hello() {
    return "helloWorld";
  }
}
パラメーター化されたインスタンスメソッドのあるクラスの追加
public class Add {

  public int x = 0;
  public int y = 0;

  //Constructor
  public Add(int numA, int numB) {
	        x = numA;
	        y = numB;
  }

  //Instance method with parameters: add(int x, int y).
  //Returns the sum of inputs x and y.
  public int add(int x, int y) {
    return x + y;
  }
}

hello()​ と ​add()​ を呼び出す Mule アプリケーションを作成する方法

  1. Studio で、​[File (ファイル)]​ > ​[New (新規)]​ > ​[Project (プロジェクト)]​ を選択し、プロジェクト名 (​javaexamples​) を指定して、​[Finish (完了)]​ をクリックします。

  2. Package Explorer​ で Mule プロジェクトの ​src/main/java​ ディレクトリを右クリックして、クラスの Java パッケージを作成します。

  3. [New (新規)]​ > ​[Package (パッケージ)]​ を選択します。

  4. [Name (名前)]​ 項目に「​com.examples​」というパッケージ名を指定します。

  5. [Finish (完了)]​ をクリックします。

    src/main/java​ ディレクトリに ​com.examples​ パッケージが表示されていることを確認します。

  6. Studio で新しい ​com.examples​ パッケージを右クリックして ​[New (新規)]​ > ​[Class (クラス)]​ を選択し、​Hello​ クラスと ​Add​ クラスの Java コードを新しい ​com.examples​ パッケージに追加します。

  7. [Name (名前)]​ 項目で、​Hello​ クラスの「​Hello.java​」という名前を入力し、​[Finish (完了)]​ をクリックします。

  8. その後のリストから、​Hello​ クラスの内容をコピーして ​Hello.java​ ファイルに貼り付けます。

    ファイル全体が次のようになり、先頭に ​package com.examples​ と表示されます。

    package com.examples;
    
    public class Hello {
    
      //Constructor
      public Hello() { }
    
      //Instance method: hello()
      //Returns the string "helloWorld".
      public String hello() {
        return "helloWorld";
      }
    }
  9. Studio で新しい ​com.examples​ パッケージを右クリックして、​[New (新規)]​ > ​[Class (クラス)]​ を選択します。

  10. [Name (名前)]​ 項目に「​Add.java​」値を入力します。

  11. [Finish (完了)]​ をクリックします。

  12. クラスの内容をコピーして ​Add.java​ ファイルに貼り付けます。

    ファイル全体が次のようになり、先頭に ​package com.examples​ と表示されます。

    package com.examples;
    
    public class Add {
    
      public int x = 0;
      public int y = 0;
    
      //Constructor
      public Add(int numA, int numB) {
              x = numA;
              y = numB;
      }
    
      //Instance method with parameters: add(int x, int y).
      //Returns the sum of inputs x and y.
      public int add(int x, int y) {
        return x + y;
      }
    }
  13. Studio の ​[javaexamples]​ タブをクリックして、Mule アプリケーションに戻り、​Hello​ クラスのフローと ​hello()​ メソッドをセットアップします。

    1. [javaexamples]​ で、​Scheduler​ コンポーネントを Studio キャンバスにドラッグして、フローのトリガーを指定します。

      省略可能: Scheduler​ コンポーネントの頻度をデフォルト以外の値に設定することもできます。たとえば、​[Frequency (頻度)]​ を [​10​]、​[Time unit (時間単位)]​ を [​SECONDS​] に設定します。

    2. Mule パレットで Java Module が選択可能になっていない場合は、​[Add Module (モジュールの追加)]​ をクリックして、Java Module をパレットの左列にドラッグします。

    3. Java Module をクリックし、その ​New​ 操作をフローの Scheduler の右側に配置してから、操作をダブルクリックして設定します。

      • Class (クラス)​: com.examples.Hello

      • Constructor (コンストラクター)​: Hello()

        [Constructor (コンストラクター)]​ 設定の ​[fx]​ はクリックしないでください。

    4. Invoke​ 操作をフローの ​New​ 操作の右側に配置してから、操作をダブルクリックして設定します。

      • [Instance (インスタンス)]​ 項目で、​[fx]​ をクリックし、値を [​payload​] に設定します。

      • [Class (クラス)]​ 項目: com.examples.Hello

      • [Method (メソッド)]​ 項目: hello()

        [Method (メソッド)]​ 設定の ​[fx]​ はクリックしないでください。

    5. Logger​ コンポーネントを見つけて、フローの ​Invoke​ 操作の右側にドラッグし、その ​[Message (メッセージ)]​ 項目で ​[fx]​ をクリックして「​payload​」と入力します。

    6. Flow Reference​ コンポーネントを見つけて、​Logger​ コンポーネントの右側にドラッグし、このコンポーネントをダブルクリックして、​[Flow Name (フロー名)]​ 項目を [​javaexamplesFlow1​] に設定します。これは、次のステップで作成する新しいフローの名前です。

  14. 新しい ​Flow​ コンポーネントを既存のフローの下にドラッグして、新しいフローをセットアップします。この際、その名前が ​javaexamplesFlow1​ であることを確認します (つまり、他のフローの ​[Flow Reference (フロー参照)]​ 設定がこの新しいフローの名前と一致します)。

    1. Java Module をクリックして、​New​ 操作を新しい ​javaexamplesFlow1​ フローの ​[Process (プロセス)]​ セクションにドラッグしてから、この操作に次の設定を指定します。

      • Args (引数)​: 引数の ​{ "numA" : 5, "numB" : 6}​。

      • Class (クラス)​: com.examples.Add

      • Constructor (コンストラクター)​: Add(int,int)

        [Constructor (コンストラクター)]​ 設定の ​[fx]​ はクリックしないでください。

    2. Invoke​ 操作を新しいフローの ​New​ 操作の右側に配置してから、次の設定を指定します。

      • [fx]​ をクリックし、​[Instance (インスタンス)]​ 項目を [​payload​] に設定します。

      • Args (引数)​: 呼び出し時に処理する引数の ​{ "x" : 3, "y" : 4}

      • Class (クラス)​: com.examples.Add

      • Method (メソッド)​: add(int,int)

        [Method (メソッド)]​ 設定の ​[fx]​ はクリックしないでください。

    3. New​ 操作の処理を続行し、​[Advanced (詳細)]​ 設定リンクをクリックして、​[Output (出力)]​ 値を Invoke 操作のペイロードを保存する対象変数に設定します。

      • Target Variable (対象変数)​: mySum

      • Target Value (対象値)​: payload

        このステップでは、ペイロードを対象変数に渡す必要が生じた場合の方法を示しています。

    4. Logger​ コンポーネントを新しいフローの ​Invoke​ 操作の右側に配置し、​[fx]​ をクリックして、​[Message (メッセージ)]​ 項目を [​vars.mySum​] に設定します。

      この ​[Logger (ロガー)]​ 設定は、Studio コンソールの対象変数に保存されるペイロードの表示用です。

  15. 名前付きパラメーターを見やすくするために、Mule コンパイラープラグインの XML を Mule プロジェクトの ​pom.xml​ ファイルに追加します。

    1. Package Explorer​ で、​javaexamples​ プロジェクトの下部にある ​pom.xml​ をダブルクリックします。

    2. Mule コンパイラープラグインの XML を ​pom.xml​ ファイルの ​<build><plugins></plugins></build>​ 要素の間に追加し、ここに定義済みのプラグインがあれば保持します。

      <build>
        <plugins>
          <!-- any other plugins -->

      この XML を POM ファイルに貼り付けます。

          <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.8.1</version>
            <configuration>
              <parameters>true</parameters>
              <source>1.8</source>
              <target>1.8</target>
              </configuration>
          </plugin>
      </plugins>
      </build>

      Maven コンパイラープラグインの XML を追加せずに、​New​ 操作で指定したパラメーターを使用しようとすると、​New​ 操作が失敗し、次のようなメッセージが表示されます。

      Failed to instantiate Class [com.examples.Add] with arguments [Integer numA, Integer numB]. (引数 [Integer numA, Integer numB] でのクラス [com.examples.Add] のインスタンス化に失敗しました。) Expected arguments are [int arg0, int arg1] (期待される引数は [int arg0, int arg1] です)

  16. Studio で ​[javaexamples]​ タブをクリックして、Mule アプリケーションに戻ります。

  17. 上部の一連のメニューから ​[Run (実行)]​ > ​[Run (実行)]​ を選択して、Mule アプリケーションを実行します。

  18. プロジェクトが正常にデプロイされたら、​[Console (コンソール)]​ で出力が予想どおりであることを確認します。

    コンソールには次のような出力が表示されます (読みやすいように短縮してあります)。

    INFO  2019-09-22 09:21:32 ... [event: 4c31f...] ... LoggerMessageProcessor: helloWorld
    INFO  2019-09-22 09:21:32 ... [event: 4c31f...] ... LoggerMessageProcessor: 7
    • helloWorld​ は ​javaexamplesFlow​ の出力値です。

    • 7​ は ​javaexamplesFlow1​ の出力値です。