2.6.3. エンドポイントバインディング
バインディングの概要
Apache Camel において、バインディング とは、エンドポイントにコントラクトを結び付ける方法です。たとえば Data Format、Content Enricher、または検証ステップを適用することでコントラクトを結び付けます。入力メッセージには条件または変換が適用され、出力メッセージには補完的な条件または変換が適用されます。
DataFormatBinding
DataFormatBinding クラスは、特定のデータフォーマットをマーシャリングしたりアンマーシャリングしたりするバインディングを定義したい場合に有効です (「マーシャリングとアンマーシャリング」 を参照)。この場合、バインディングの作成に必要なのは、コンストラクターに必要なデータフォーマットへの参照を渡して DataFormatBinding インスタンスを作成することだけです。
たとえば、例2.2「JAXB バインディング」 の XML DSL スニペットは、Apache Camel エンドポイントに関連付けられたときに、JAXB データフォーマットをマーシャリングおよびアンマーシャリングできるバインディング (ID は jaxb) を示しています。
例2.2 JAXB バインディング
<beans ... >
...
<bean id="jaxb" class="org.apache.camel.processor.binding.DataFormatBinding">
<constructor-arg ref="jaxbformat"/>
</bean>
<bean id="jaxbformat" class="org.apache.camel.model.dataformat.JaxbDataFormat">
<property name="prettyPrint" value="true"/>
<property name="contextPath" value="org.apache.camel.example"/>
</bean>
</beans>バインディングとエンドポイントの関連付け
エンドポイントとバインディングを関連付けるには、以下の方法を使用できます。
Binding URI
バインディングをエンドポイントに関連付けるには、エンドポイント URI に binding:NameOfBinding をプレフィックスとして付けます。ここで NameOfBinding は、バインディングの Bean ID になります (例: Spring XML で作成されたバインディング Bean の ID)。
たとえば、以下の例では、ActiveMQ エンドポイントを 例2.2「JAXB バインディング」 で定義された JAXB バインディングに関連付ける方法を示しています。
<beans ...>
...
<camelContext xmlns="http://camel.apache.org/schema/spring">
<route>
<from uri="binding:jaxb:activemq:orderQueue"/>
<to uri="binding:jaxb:activemq:otherQueue"/>
</route>
</camelContext>
...
</beans>BindingComponent
プレフィックスを使用してバインディングをエンドポイントに関連付ける代わりに、関連付けを暗黙的に行い、バインディングが URI に表示されないようにすることもできます。暗黙的なバインディングを持たない既存のエンドポイントの場合、最も簡単な方法は BindingComponent クラスを使用してエンドポイントをラップすることです。
たとえば、jaxb バインディングを activemq エンドポイントに関連付けるには、以下のように新しい BindingComponent インスタンスを定義します。
<beans ... >
...
<bean id="jaxbmq" class="org.apache.camel.component.binding.BindingComponent">
<constructor-arg ref="jaxb"/>
<constructor-arg value="activemq:foo."/>
</bean>
<bean id="jaxb" class="org.apache.camel.processor.binding.DataFormatBinding">
<constructor-arg ref="jaxbformat"/>
</bean>
<bean id="jaxbformat" class="org.apache.camel.model.dataformat.JaxbDataFormat">
<property name="prettyPrint" value="true"/>
<property name="contextPath" value="org.apache.camel.example"/>
</bean>
</beans>
jaxbmq の 2 つ目のコンストラクター引数 (オプション) で URI プレフィックスを定義します。これで、この jaxbmq ID をエンドポイント URI のスキームとして使用できるようになりました。たとえば、このバインディングコンポーネントを使用して以下のルートを定義できます。
<beans ...>
...
<camelContext xmlns="http://camel.apache.org/schema/spring">
<route>
<from uri="jaxbmq:firstQueue"/>
<to uri="jaxbmq:otherQueue"/>
</route>
</camelContext>
...
</beans>上記のルートは、Binding URI のアプローチを使用する以下のルートと同じです。
<beans ...>
...
<camelContext xmlns="http://camel.apache.org/schema/spring">
<route>
<from uri="binding:jaxb:activemq:foo.firstQueue"/>
<to uri="binding:jaxb:activemq:foo.otherQueue"/>
</route>
</camelContext>
...
</beans>
カスタムの Apache Camel コンポーネントを実装する開発者は、org.apache.camel.spi.HasBinding インターフェースを継承するエンドポイントクラスを実装することで、これを実現できます。
BindingComponent コンストラクター
BindingComponent クラスは以下のコンストラクターをサポートします。
public BindingComponent()- 無引数の形式です。プロパティー注入を使用してバインディングコンポーネントインスタンスを設定します。
public BindingComponent(Binding binding)-
このバインディングコンポーネントを指定された
Bindingオブジェクトのbindingに関連付けます。 public BindingComponent(Binding binding, String uriPrefix)-
このバインディングコンポーネントを指定された
Bindingオブジェクトのbinding、および URI プレフィックスuriPrefixに関連付けます。これが、最も一般的に使用されるコンストラクターです。 public BindingComponent(Binding binding, String uriPrefix, String uriPostfix)-
このコンストラクターは、追加の URI ポストフィックス
uriPostfix引数をサポートします。これは、このバインディングコンポーネントを使用して定義された URI に自動的に追加されます。
カスタムバインディングの実装
マーシャリングおよびアンマーシャリングのデータフォーマットに使用される DataFormatBinding に加えて、独自のカスタムバインディングを実装することができます。カスタムバインディングを以下のように定義します。
-
org.apache.camel.Processorクラスを実装して、(from要素に登場) コンシューマーエンドポイントで受信するメッセージに対して変換を行います。 -
補完関係となる
org.apache.camel.Processorクラスを実装して、プロデューサーエンドポイント (to要素に登場) から送信されるメッセージに対して逆変換を行います。 -
org.apache.camel.spi.Bindingインターフェースを実装します。これは上記のプロセッサーインスタンスのファクトリーとして機能します。
Binding インターフェース
例2.3「org.apache.camel.spi.Binding インターフェース」 は org.apache.camel.spi.Binding インターフェースの定義を示しています。このインタフェースは、カスタムバインディングを定義するために実装する必要があります。
例2.3 org.apache.camel.spi.Binding インターフェース
// Java
package org.apache.camel.spi;
import org.apache.camel.Processor;
/**
* Represents a <a href="http://camel.apache.org/binding.html">Binding</a> or contract
* which can be applied to an Endpoint; such as ensuring that a particular
* <a href="http://camel.apache.org/data-format.html">Data Format</a> is used on messages in and out of an endpoint.
*/
public interface Binding {
/**
* Returns a new {@link Processor} which is used by a producer on an endpoint to implement
* the producer side binding before the message is sent to the underlying endpoint.
*/
Processor createProduceProcessor();
/**
* Returns a new {@link Processor} which is used by a consumer on an endpoint to process the
* message with the binding before its passed to the endpoint consumer producer.
*/
Processor createConsumeProcessor();
}バインディングを使うタイミング
バインディングは、多くの異なるエンドポイントに同じ種類の変換を適用する必要がある場合に有効です。