Flex Gateway新着情報
Governance新着情報
Monitoring API ManagerJava メソッド (インスタンスまたは静的) は、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 エラーが表示されます。「リソースのエクスポート方法」を参照してください。 |
インスタンスメソッドを呼び出す手順は、次のとおりです。
次の例では、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
操作の出力メタデータは次のようになります。
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>
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>
Anypoint Studio では、Java パッケージをプロジェクトに書き込みまたは読み込み、1 つ以上のフロー内で Java 操作を設定してから、その操作が存在する Mule アプリケーションを実行できます。
この例では、Mule アプリケーションに 2 つのフローをセットアップします。
小さな Java パッケージ (com.examples
) を記述します。
インスタンスメソッド (Hello.java
と Add.java
) を含む 2 つのシンプルな Java クラスを記述します。
Apache Maven コンパイラープラグインを使用して、arg0
、arg1
などではなく、設定で名前付きパラメーターを使用できる方法でクラスをコンパイルします。
Java Module の New 操作を使用して、Hello
と Add
オブジェクトをインスタンス化し、インスタンスメソッド内の名前付きパラメーターにアクセスします。
Java Module の Invoke 操作を使用して、hello()
と add(3,4)
インスタンスメソッドを呼び出します。
Mule アプリケーションを実行して、Studio で New 操作と Invoke 操作を実行します。
次のような 2 つのシンプルな Java クラスでメソッドを呼び出すとします。
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 アプリケーションを作成する方法
Studio で、[File (ファイル)] > [New (新規)] > [Project (プロジェクト)] を選択し、プロジェクト名 (javaexamples
) を指定して、[Finish (完了)] をクリックします。
Package Explorer で Mule プロジェクトの src/main/java
ディレクトリを右クリックして、クラスの Java パッケージを作成します。
[New (新規)] > [Package (パッケージ)] を選択します。
[Name (名前)] 項目に「com.examples
」というパッケージ名を指定します。
[Finish (完了)] をクリックします。
src/main/java
ディレクトリに com.examples
パッケージが表示されていることを確認します。
Studio で新しい com.examples
パッケージを右クリックして [New (新規)] > [Class (クラス)] を選択し、Hello
クラスと Add
クラスの Java コードを新しい com.examples
パッケージに追加します。
[Name (名前)] 項目で、Hello
クラスの「Hello.java
」という名前を入力し、[Finish (完了)] をクリックします。
その後のリストから、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";
}
}
Studio で新しい com.examples
パッケージを右クリックして、[New (新規)] > [Class (クラス)] を選択します。
[Name (名前)] 項目に「Add.java
」値を入力します。
[Finish (完了)] をクリックします。
クラスの内容をコピーして 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;
}
}
Studio の [javaexamples] タブをクリックして、Mule アプリケーションに戻り、Hello
クラスのフローと hello()
メソッドをセットアップします。
[javaexamples] で、Scheduler コンポーネントを Studio キャンバスにドラッグして、フローのトリガーを指定します。
省略可能: Scheduler コンポーネントの頻度をデフォルト以外の値に設定することもできます。たとえば、[Frequency (頻度)] を [10
]、[Time unit (時間単位)] を [SECONDS
] に設定します。
Mule パレットで Java Module が選択可能になっていない場合は、[Add Module (モジュールの追加)] をクリックして、Java Module をパレットの左列にドラッグします。
Java Module をクリックし、その New 操作をフローの Scheduler の右側に配置してから、操作をダブルクリックして設定します。
Class (クラス): com.examples.Hello
Constructor (コンストラクター): Hello()
[Constructor (コンストラクター)] 設定の [fx] はクリックしないでください。
Invoke 操作をフローの New 操作の右側に配置してから、操作をダブルクリックして設定します。
[Instance (インスタンス)] 項目で、[fx] をクリックし、値を [payload
] に設定します。
[Class (クラス)] 項目: com.examples.Hello
[Method (メソッド)] 項目: hello()
[Method (メソッド)] 設定の [fx] はクリックしないでください。
Logger コンポーネントを見つけて、フローの Invoke 操作の右側にドラッグし、その [Message (メッセージ)] 項目で [fx] をクリックして「payload
」と入力します。
Flow Reference コンポーネントを見つけて、Logger コンポーネントの右側にドラッグし、このコンポーネントをダブルクリックして、[Flow Name (フロー名)] 項目を [javaexamplesFlow1
] に設定します。これは、次のステップで作成する新しいフローの名前です。
新しい Flow コンポーネントを既存のフローの下にドラッグして、新しいフローをセットアップします。この際、その名前が javaexamplesFlow1
であることを確認します (つまり、他のフローの [Flow Reference (フロー参照)] 設定がこの新しいフローの名前と一致します)。
Java Module をクリックして、New 操作を新しい javaexamplesFlow1
フローの [Process (プロセス)] セクションにドラッグしてから、この操作に次の設定を指定します。
Args (引数): 引数の { "numA" : 5, "numB" : 6}
。
Class (クラス): com.examples.Add
Constructor (コンストラクター): Add(int,int)
[Constructor (コンストラクター)] 設定の [fx] はクリックしないでください。
Invoke 操作を新しいフローの New 操作の右側に配置してから、次の設定を指定します。
[fx] をクリックし、[Instance (インスタンス)] 項目を [payload
] に設定します。
Args (引数): 呼び出し時に処理する引数の { "x" : 3, "y" : 4}
Class (クラス): com.examples.Add
Method (メソッド): add(int,int)
[Method (メソッド)] 設定の [fx] はクリックしないでください。
New 操作の処理を続行し、[Advanced (詳細)] 設定リンクをクリックして、[Output (出力)] 値を Invoke 操作のペイロードを保存する対象変数に設定します。
Target Variable (対象変数): mySum
Target Value (対象値): payload
このステップでは、ペイロードを対象変数に渡す必要が生じた場合の方法を示しています。
Logger コンポーネントを新しいフローの Invoke 操作の右側に配置し、[fx] をクリックして、[Message (メッセージ)] 項目を [vars.mySum
] に設定します。
この [Logger (ロガー)] 設定は、Studio コンソールの対象変数に保存されるペイロードの表示用です。
名前付きパラメーターを見やすくするために、Mule コンパイラープラグインの XML を Mule プロジェクトの pom.xml
ファイルに追加します。
Package Explorer で、javaexamples プロジェクトの下部にある pom.xml
をダブルクリックします。
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] です)
Studio で [javaexamples] タブをクリックして、Mule アプリケーションに戻ります。
上部の一連のメニューから [Run (実行)] > [Run (実行)] を選択して、Mule アプリケーションを実行します。
プロジェクトが正常にデプロイされたら、[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 の出力値です。