例: Java モジュールを使用してメソッドを呼び出す方法

Java モジュールまたは DataWeave 式で操作を使用して、Java メソッドを呼び出すことができます。

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

次の例は、インスタンスメソッドを呼び出す方法を示しています。最初に、Java モジュール の New 操作 (<java:new/>) を使用して、メソッドを呼び出すインスタンスを作成します。次に、Java モジュールの Invoke 操作を使用して、引数を取らないメソッド (init()) を呼び出します。

<java:new class="com.foo.TaxCalculator"
  constructor="TaxCalculator()"
  target="taxCalculator"/>
<java:invoke instance="#[vars.taxCalculator]"
  class="com.foo.TaxCalculator"
  method="init()"/>

<java:new> を使用してインスタンスを作成せずに、他の場所からメソッドを取得することもできます。

次の例では、price を取るメソッド (calculate(long)) を呼び出します。 引数:

<java:new class="com.foo.TaxCalculator"
  constructor="TaxCalculator()"
  target="taxCalculator"/>
<java:invoke instance="#[vars.taxCalculator]"
  class="com.foo.TaxCalculator"
  method="calculate(Long)">
    <java:args>#[{price: payload.price}]</java:args>
</java:invoke>

Studio のシンプルな例については、Studio での New 操作および Invoke 操作の使用を参照してください。

args パラメータにメソッド引数を設定する場合は、DataWeave オブジェクトのキーでどのパラメータを呼び出すかを識別します。 パラメータを名前 (price など) で参照するためには-parameters compiler option を使用して、メソッドまたはコンストラクタを含む Java クラスをコンパイルする必要があります。 クラスがこのオプションを使用してコンパイルされていない場合は、同じパラメータが arg0arg1 のような正規の方法で参照されます。名前で参照するパラメータをコンストラクタが処理するようにするには、Mule プロジェクトの pom.xml ファイルに Maven コンパイラプラグインの XML も追加する必要があります。 追加しないと、エラーが生じます。

Studio の Java モジュールには、<java:new/> に関連付けられているメタデータ用や、出力値と入力引数の両方用の DataSense が用意されています。

静的メソッドの呼び出し

静的 Java メソッドは次のようなコードで呼び出すことができます。

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

Studio の例については、Studio での New 操作および Invoke 操作の使用を参照してください。

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

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

Java モジュールの例

この例では、Mule アプリケーションに 2 つのフローをセットアップします。設定手順は次のとおりです。

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

  • インスタンスメソッド (Hello.javaAdd.java) を含むシンプルな Java クラスを記述します。

  • Maven コンパイラプラグインを使用して、arg0arg1 などではなく、設定で指定したパラメータを使用できるようにする方法でクラスをコンパイルします。

  • Java モジュールの New 操作を使用して、HelloAdd オブジェクトをインスタンス化し、インスタンスメソッドで指定したパラメータにアクセスします。

  • Java モジュールの Invoke 操作を使用して、hello()add(3,4) インスタンスメソッドを呼び出します。

  • 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 で、javaexamples のような名前の新しいプロジェクトを作成します。

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

  2. クラスの Java パッケージを作成します。

    1. [Package Explorer] タブ (左側) で、Mule プロジェクトの src/main/java ディレクトリを右クリックします。

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

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

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

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

  3. Hello クラスと Add クラスの Java コードを新しい com.examples パッケージに追加します。

    1. Studio で新しい com.examples パッケージを右クリックして、[New (新規)][Class (クラス)] を選択します。

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

    3. 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";
        }
      }
    4. Studio で新しい com.examples パッケージを右クリックして、[New (新規)][Class (クラス)] を選択します。

    5. [Name (名前)] に「Add.java」と入力します。

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

    7. クラスコンテンツをコピーして 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;
        }
      }
  4. Studio の [javaexamples] タブをクリックして、Mule アプリケーションに戻り、Hello クラスのフローと hello() メソッドを設定します。

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

      省略可能: スケジューラの頻度設定をデフォルトより少なくすることもできます。たとえば、[Frequency (頻度)] を「10」、[Time unit (時間単位)] を [SECONDS] に設定します。

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

    3. Java モジュールをクリックして、その New 操作をフローのスケジューラの右側に配置してから、操作をダブルクリックして設定します。

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

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

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

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

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

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

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

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

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

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

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

    1. Java モジュールをクリックして、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. ロガーコンポーネントを新しいフローの Invoke 操作の右側に配置し、[fx] をクリックして、[Message (メッセージ)] 項目を [vars.mySum] に設定します。

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

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

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

    2. Mule コンパイラプラグイン の XML を POM ファイルの <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.0</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]. Expected arguments are [int arg0, int arg1]

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

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

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

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

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

    • 7javaexamplesFlow1 の出力値です。

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

DataWeave 式を使用して、Java メソッドを呼び出すことができます。この手法は、boolean 値を返すメソッドで特に役立ちます。

次の例では、Java モジュールの操作は使用せず、選択肢コンポーネントで DataWeave 式を使用しています。

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

vars.taxCalculator には、上記で説明したとおり、<java:new/> で作成した com.foo.TaxCalculator のインスタンスが含まれます。

Was this article helpful?

💙 Thanks for your feedback!

Edit on GitHub