ESB Muleはコンポーネントを生成するコンテナとそれを管理するESB Muleモデルを区別しています。即ち、開発者はESB Muleが管理するコンポーネントをSpringFrameworkやPicoContainerのようなコンテナで生成することができます。このページはその設定をSpringコンテナを使って行う説明をします。他コンテナでも同じような方法を使って利用することができます。
この例では2つのビーンを使います:RestaurantWaiterビーンは注文を受け、それを記録し、KitchenServiceビーンに注文を引き渡します。KitchenServiceは受取った注文を基に「何か」をします。ビーンは以下のように定義されます:
public class RestaurantWaiter
{
private KitchenService kitchen = null;
public void takeOrder(Order order) {
this.kitchen.submitOrder(order);
}
public void setKitchenService(KitchenService kitchen) {
this.kitchen = kitchen;
}
public KitchenService getKitchenService() {
return kitchen;
}
}
Springのセットアップ
先ず、Springアプリケーション・コンテキストを定義します。このコンテキストにRestaurantWaiterとKitchenServiceビーンが定義されます:
<beans>
<bean id='restaurantWaiter' singleton='false' class='com.foo.RestaurantWaiter'>
<property name='kitchenService'><ref local='kitchenService'/></property>
</bean>
<bean id='kitchenService' class='com.foo.KitchenService'/>
</beans>
これで、Springで生成されたrestaurantWaiterとkitchenServiceがあります。resturantWaiterはシングルトンとして宣言されていないことに注意してください(Springは定義がされてなければビーンをシングルトンにします)。ESB Muleはコンポーネントをプールするため、各プール・インスタンスに独自のインスタンスを割り当てるためにSpringにコンポーネントをシングルトンで生成しないように指示します。
ESB Muleコンポーネントの設定
Springコンテキスト構成を構成した後は、ESB Mule XML設定からmyBeanのレファレンスを作成することができます。ESB Muleが管理するコンポーネントは <mule-descriptor> タグで定義します。ここでは、restaurantWaiterがJMSからイベントを受信するためにディスクリプタ(descriptor)の定義を行います:
<mule-descriptor name="Restaurant Waiter" implementation="restaurantWaiter">
<inbound-router>
<endpoint address="vm://order.queue"/>
</inbound-router>
</mule-descriptor>
ここで重要なので、 implementation 属性です。この属性の値で、実行時にビーンを識別します。
コンテナの設定
最後に行うことは、ESB MuleにどこにSpringアプリケーション・コンテキストがあるかを伝えることです。ESB Muleマネージャは実行中にコンポーネントを取得するコンテナ・コンテキストの場所を知り、ESB XML設定のコンテナ・オブジェクトを繋ぎます。ESB Muleは PicoContainerContext と SpringContainercontext を同梱しています。それ以外のコンテナを利用したい場合は、 UMOContainerContext インターフェースを使って簡単に作成することができます。ESB MuleマネージャをSpringコンテナ・コンテキストに設定した後には、ESB Muleはコンテナ内のオブジェクトのmule-descriptor implementation 属性を自動的にチェックします。Springコンテナ・コンテキストを設定するには、ESB Mule XML設定のルート内に以下を宣言を挿入します:
<mule-configuration>
....
<container-context className='org.mule.extras.spring.SpringContainerContext'>
<properties>
<property name='configFile' value='../conf/applicationContext.xml'/>
</properties>
</container-context>
....
</mule-configuration>
configFileプロパティはapplicationContext.xmlファイルがある場所を指定します。クラスパス又はローカル・ファイル・パスを指定することができます。
その次は?
これで、試す準備ができました。ESB Muleサーバが起動すると、コンテナ・コンテキストがロードされます。各 mule-descriptor 要素はロードされ、implementation属性を使ってコンテナのビーンが検索されます。見つかったビーンはESB Muleマネージャ・コンテナに追加されます。
vm://orders.queueにイベントを受信した場合は、OrderオブジェクトはRestaurantWaiterの takeOrder() メソッドに渡され、RestaurantWaiterはOrderをログした後にKitchenServiceへ渡します。
関連オブジェクトをコンテナにロードする
コンテナ・コンテキストを使って mule-descriptor オブジェクトの実装をロードするだけではなく、エンドポイント, トランスフォーマ, コネクタ, エージェントのようにESB Muleサーバに設定されたオブジェクトの関連を解析することもできます。コンテナで管理されているオブジェクトを参照するには<container-property>タグを使います:
<mule-descriptor name='Restaurant Waiter' implementation='restaurantWaiter'>
<inbound-router>
<endpoint address="vm://myBean.queue"/>
</inbound-router>
<properties>
<container-property name='kitchenService' reference='kitchenService' required='true'/>
</properties>
</mule-descriptor>
<container-property>タグの「name」属性は管理されているコンポーネント「restaurantWaiter」のビーンミューテータ・メソッドを意味しています。「reference」属性はコンテナ内のビーン名で、「required」属性は「referece」属性で指定されたビーンが無い場合に例がを投げるかです。
ESB Muleオブジェクトの詳細に付いては設定プロパティを参照してください。