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 コンポーネントリファレンスガイド の 言語 を参照してください。