以下の例題は異なるエンドポイントからOrdersを受信し、それを処理して、 processed.queue へ送信する OrderManager ビーンを設定します。
例題はESB MuleイベントからSpringを読まれたことを前提とします。
OrderManagerは以下の方法で注文を取得することができます:
- orders.queue のJMSメッセージ
- アドレス orders@myrestaurant.com へのメール
- SOAP web service
ESB MuleイベントをSpringビーンが受信できるようにするためには、
MuleEventListener又は MuleSubscriptionEventListenerを
実装します。
まず、 OrderManager のソースコードを見てから、動作を説明しましょう。
OrderManagerサービスは注文を処理するために1つのメソッドを公開します:
public interface OrderManager
{
public String processOrder(Order order);
}
OrderManagerBeanはOrderManager及びMuleSubscriptionEventListenerを実装します。
public class OrderManagerBean implements MuleSubscriptionEventListener, OrderManager
{
private String[] subscriptions;
public void onApplicationEvent(ApplicationEvent orderEvent)
{
Order order = (Order) orderEvent.getSource();
String result = processOrder(order);
MuleApplicationEvent muleEvent = (MuleApplicationEvent) orderEvent;
MuleApplicationEvent returnEvent = new MuleApplicationEvent(
result, "jms:);
muleEvent.getApplicationContext().publishEvent(returnEvent);
}
public String processOrder(Order order)
{
return "Order '" + order.getOrder() + "' Processed";
}
public String[] getSubscriptions()
{
return subscriptions;
}
public void setSubscriptions(String[] subscriptions)
{
this.subscriptions = subscriptions;
}
}
subscriptionメソッドのgetとsetに注目してください。これらは MuleSubscriptionEventListener インターフェースの一部であり、 OrderManager が受信するイベントを決めます。
<bean id="orderManager" class="org.mule.extras.spring.events.OrderManagerBean">
<property name="subscriptions">
<list>
<value>
jms://orders.queue
</value>
<value>
pop3://orders:secret@mail.myrestaurant.com?transformers=EmailMessageToString,StringToOrder
</value>
<value>
glue:http://localhost:44444/mule/OrderManager
</value>
</list>
</property>
</bean>
上の設定で、ビーンは orders@myrestaurant.com に送られたメールと order.queue に送られたJMSメッセージを受信します。3番目のSOAPサブスクリプションは明瞭ではないかもしれませんが、サブスクリプションとして使われた場合は、ESB Mule SOAPプロバイダは自動的にOrderManagerをWeb Serviceとして公開します!SOAPクライアントはOrderManagerBeanをHTTP上のWeb Serviceとして起動できます。
 | MuleClient as a soap client
OrderManager Web Serviceを試すのに、ESB Muleクライアントを使うことができます:
MuleClient client = new MuleClient();
Order order = new Order("Sausage and Mash");
String endpoint = "glue:http:;
UMOMessage result = client.send(endpoint, order, null);
|
ESB MuleとSpringの設定
ESB MuleをSpringイベントの仕組みにつなげるには、アプリケーション・コンテキストに MuleEventMulticaster ビーンを宣伝します。Springからイベントを送受信するために使われます。
<bean id="applicationEventMulticaster" class="org.mule.extras.spring.events.MuleEventMulticaster"/>
<property name="asynchronous"><value>false</value></property>
</bean>
 | ビーン定義名
MuleEventMulticasterのビーン定義名は{{applicationEventMulticaster}}でなければなりません。 |
 | ESB Muleマネージャ・インスタンスは不要
この設定には、別途にESB Muleマネージャのインスタンスを設定する必要はありません。MuleEventMulticasterのビーン定義名が正しく設定された場合は、自動的にESB Muleマネージャのインスタンスが起動して、設定されます。 |
 | 非同期で実行
MuleEventMulticasterは非同期で実行することができます。その場合は、ESB Muleはリスナー毎にスレッドプールを作成します。多くのイベントがある場合やイベント処理に時間が掛かる場合は非同期するすると性能が改善される場合があります。スレッド・プールのふるまいはthreadingProfileで制御することができます。 |
Springイベント例題のテスト・ケースのESB Muleインスタンスの設定に付いてはXML設定を参照してください。
トランフォメーション処理
これまでは、JMS, POP3, SOAP上でイベントを受信するためのOrderManagerBeanを設定して来ましたが、各トランスポートからOrderオブジェクトを取得する方法に付いては触れていませんでした。それはESB Muleトランスフォーマーを使って行います。各トランスポートを見てみましょう:
JMS
ESB Muleはデフォルトでは、自動的に標準JMSトランスフォーマーを使ってJMSメッセージを変換します。トランスフォーマーをオーバライドすることもできますが、多くの場合はデフォルトで十分です。
POP3
メッセージの本文をOrderオブジェクトに変換するためにトランスフォーマーを作成する必要があります。
POP3エンドポイントに transformers パラメータがあることに注目してください。このパラメータは受信したメールメッセージに適用するトランスフォーマーのコンマ区切り一覧です。
トランスフォーマー名はアプリケーション・コンテキストのトランスフォーマー・ビーンです。その結果、各トランスフォーマー用のために2つのビーンを追加する必要があるます。
<bean id="EmailMessageToString" class="org.mule.providers.email.transformers.EmailMessageToString"/>
<bean id="StringToOrder" class="org.mule.extras.spring.events.StringToOrder">
<property name="returnClass"><value>org.mule.extras.spring.events.Order</value></property>
</bean>
SOAP
全ての変換はSOAPサーバで処理されます。ESB Muleは自動的にタイプ・マッピングするようにサーバを設定します。詳細に付いてはSOAPプロバイダを参照にしてください。
イベントの受信
OrderManagerbeanがJMS又はPOP3からイベントを受信した場合は、 onApplicationEvent がOrderソース・オブジェクトで起動されます。ビーンが受信する前にESB Muleはイベントを変換します。 OrderManagerBean がWeb Serviceとして起動された場合は、 processOrder メソッドが OrderManager インターフェースを公開しているために直接に呼ばれます。
イベントのpublish
OrderManagerBeanのコードから MuleApplicationEvents がアプリケーション・コンテキストを介して公開されていることが分かります。
これは、ビーンは何時でもESB MuleイベントをESB Muleエンドポイントを使ってESB Muleトランスポート上で公開することが可能であることを意味しています。
例題では、イベントからSpringFrameworkアプリケーション・コンテキストを取得します。これは便利ですが、必須ではありません。ビーンでApplicationContextAwareを実装してESB Muleイベントを送信することも可能です。この方法ではイベントを先ず受信する必要がなくなります。