13.2. 式言語の呼び出し方法
前提条件
特定の式言語を使用する前に、必要な JAR ファイルがクラスパス上にあることを確認してください。使用する言語が Apache Camel Core に含まれていない場合、関連する JAR をクラスパスに追加する必要があります。
Maven ビルドシステムを使用している場合は、関連する依存関係を POM ファイルに追加するだけで、JAR をビルド時のクラスパスに含むことができます。たとえば、Ruby 言語を使いたい場合は、以下の依存関係を POM ファイルに追加します。
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-groovy</artifactId>
<!-- Use the same version as your Camel core version -->
<version>${camel.version}</version>
</dependency>
アプリケーションを Red Hat Fuse OSGi コンテナーにデプロイする場合は、関連する言語機能がインストールされていることを確認する必要があります (機能の名前は該当する Maven アーティファクトの名前になります)。たとえば、OSGi コンテナーで Groovy 言語を使用するには、以下の OSGi コンソールコマンドを入力して camel-groovy 機能をインストールしておく必要があります。
karaf@root> features:install camel-groovy
ルートで式や述語を使用している場合は、resource:classpath:path または resource:file:path を使用して、外部リソースとして値を参照します。たとえば、resource:classpath:com/foo/myscript.groovy です。
Camel on EAP デプロイメント
camel-groovy コンポーネントは、Camel on EAP (Wildfly Camel) フレームワークによってサポートされており、Red Hat JBoss Enterprise Application Platform (JBoss EAP) コンテナー上でシンプルなデプロイモデルを提供します。
呼び出す方法
表13.1「式および述語」 で示されているように、式言語を呼び出すための構文は、それが使用されるコンテキストによって異なります。以下の方法で式言語を呼び出すことができます。
Static メソッド
ほとんどの言語は、org.apache.camel.Expression 型や org.apache.camel.Predicate 型が想定される あらゆる コンテキストで使用できる Static メソッドを定義します。Static メソッドは、文字列式 (または述語) を引数とし、Expression オブジェクト (Predicate オブジェクトでもある) を返します。
たとえば、XML 形式のメッセージを処理するコンテンツベースルーターを実装するには、以下のように /order/address/countryCode 要素の値に基づいてメッセージをルーティングできます。
from("SourceURL")
.choice
.when(xpath("/order/address/countryCode = 'us'"))
.to("file://countries/us/")
.when(xpath("/order/address/countryCode = 'uk'"))
.to("file://countries/uk/")
.otherwise()
.to("file://countries/other/")
.to("TargetURL");Fluent DSL メソッド
Java Fluent DSL は、式言語を呼び出す別のスタイルとなります。式をエンタープライズ統合パターン (EIP) の引数として指定する代わりに、DSL コマンドのサブ句で式を指定できます。たとえば、XPath 式を filter(xpath("Expression")) として呼び出す代わりに、式を filter().xpath("Expression") として呼び出すことができます。
たとえば、前述のコンテンツベースのルーターは、以下のように、この形式の呼び出しで再実装できます。
from("SourceURL")
.choice
.when().xpath("/order/address/countryCode = 'us'")
.to("file://countries/us/")
.when().xpath("/order/address/countryCode = 'uk'")
.to("file://countries/uk/")
.otherwise()
.to("file://countries/other/")
.to("TargetURL");XML 要素
関連する XML 要素の中に文字列の式を入れることで、XML 内で式言語を呼び出すこともできます。
たとえば、XML 内で XPath を呼び出すための XML 要素は xpath (標準の Apache Camel 名前空間に属している) です。XML DSL でコンテンツベース ルーターの実装では、以下のように XPath 式を使用することができます。
<from uri="file://input/orders"/>
<choice>
<when>
<xpath>/order/address/countryCode = 'us'</xpath>
<to uri="file://countries/us/"/>
</when>
<when>
<xpath>/order/address/countryCode = 'uk'</xpath>
<to uri="file://countries/uk/"/>
</when>
<otherwise>
<to uri="file://countries/other/"/>
</otherwise>
</choice>
あるいは、language 要素を使用して言語式を指定することもできます。この場合、language 属性で言語名を指定します。たとえば、以下のように language 要素を使用して、XPath 式を定義できます。
<language language="xpath">/order/address/countryCode = 'us'</language>
アノテーション
アノテーションは、Bean インテグレーションのコンテキストで使用されます。アノテーションは、メッセージまたはヘッダーから情報を抽出して、抽出したデータを Bean のメソッドパラメーターに注入するという便利な方法でもあります。
たとえば、filter() EIP の述語として呼び出される Bean myBeanProc について考えてみます。Bean の checkCredentials メソッドが true を返す場合、メッセージの処理が続行されますが、メソッドが false を返す場合は、メッセージがフィルターによってブロックされます。この Filter パターンは以下のように実装されます。
// Java
MyBeanProcessor myBeanProc = new MyBeanProcessor();
from("SourceURL")
.filter().method(myBeanProc, "checkCredentials")
.to("TargetURL");
MyBeanProcessor クラスの実装は @XPath アノテーションを利用して、以下のように、元の XML メッセージから username と password を抽出します。
// Java
import org.apache.camel.language.XPath;
public class MyBeanProcessor {
boolean void checkCredentials(
@XPath("/credentials/username/text()") String user,
@XPath("/credentials/password/text()") String pass
) {
// Check the user/pass credentials...
...
}
}
@XPath アノテーションは、注入先となるパラメーターの直前に置かれます。パスに /text() を追加し、終了タグではなく要素の内容のみが選択されるようにすることで、XPath 式がテキストノードを 明示的に 選択することに注意してください。
Camel エンドポイント URI
Camel Language コンポーネントを使用すると、エンドポイント URI でサポートされる言語を呼び出すことができます。使用可能な構文は 2 つあります。
ファイル (または Scheme で定義される他のリソースタイプ) に保存されている言語スクリプトを呼び出すには、以下の URI 構文を使用します。
language://LanguageName:resource:Scheme:Location[?Options]
スキームは、file:、classpath:、または http: にすることができます。
たとえば、以下のルートでは、クラスパスから mysimplescript.txt を実行します。
from("direct:start")
.to("language:simple:classpath:org/apache/camel/component/language/mysimplescript.txt")
.to("mock:result");2. 埋め込み言語スクリプトを実行するには、以下の URI 構文を使用します。
language://LanguageName[:Script][?Options]
たとえば、script 文字列に格納されている Simple 言語のスクリプトを実行するには、次のようにします。
String script = URLEncoder.encode("Hello ${body}", "UTF-8");
from("direct:start")
.to("language:simple:" + script)
.to("mock:result");Language コンポーネントの詳細は、Apache Camel Component Reference Guide の Language を参照してください。