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 メッセージから usernamepassword を抽出します。

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