ESB Muleクライアントは、ESB Muleサーバ及び他アプリケーションとイベントを送受信することができる簡単なJavaクライアント・プログラムです。クライアントは以下の機能をもちます:
- ローカルESB Muleサーバとのイベントの送受信。
- リモートESB Muleサーバとのイベントの送受信。
- 任意のESB Muleトランスポートを使って、他アプリケーションとの通信。
- ESB Muleサーバからコンポーネントの登録と削除。
送信と受信
多くの場合は、ESB Muleアプリケーション・イベントはメッセージをキューに受信したり、ディレクトリにファイルが複写されたりっというような外部処理に対して発生します。ESB Muleクライアント(MuleClient)はプログラムからイベントの送受信をできるようにします。例えば、my.queueキューを監視しているアプリケーション, ESB Muleコンポーネント又は他のオブジェクトにJMSメッセージを送信するには、以下のようにコーディングします:
MuleClient client = new MuleClient();
client.dispatch("jms:, "Message Payload" null);
一般的なクライアント/サーバの同期呼び出しを行うには、 send() メソッドを使います。
MuleClient client = new MuleClient();
UMOMessage result = client.send("tcp:,
"Message Payload", null);
同期呼び出しを非同期を行う
ESB Muleクライアント(MuleClient)の sendAsync() メソッドを使うと、同期呼び出しをした後に結果を待たないようにすることができます。
MuleClient client = new MuleClient();
FutureMessageResult result = client.sendAsync("http:,
"Message Payload", null);
if(result.isready()) {
Object payload = result.getMessage().getPayload();
}
クライアントの send(), sendAsync() と dispatch() メソッドには3つの引数を設定することができます:
- ESB Mule URLエンドポイント-イベントの伝達方法を指定するトランスポート、エンドポイント、他の情報を定めるESB Muleエンドポイント。
- イベント・ペイロード-任意のオブジェクトに設定することが可能です。
- プロパティ-イベントに関連したプロパティ及びメタデータ。
MuleClientとWeb Serviceクライアントとして利用
ESB MuleクライントはWeb Methods GlueやApache Axis等のSOAPの実装を使ってWeb Serviceのクライアントとして使うことができます。
MuleClient client = new MuleClient();
String[] args = new String[]{"Ross", "Mason"};
client.dispatch("axis:http:, args, null);
UMOMessage result = client.send
("axis:http:, "Ross", null);
Person person (Person)result.getPayload();
System.out.println(person.toString());
リクエスト-レスポンス
イベントを受信するには、ESB Muleクライアントの受信(receive)メソッドを使います。
例:
MuleClient client = new MuleClient();
UMOMessage result = client.receive("pop3:, 5000);
上のコードは、メールサーバmail.muleumo.orgに設定されているrossのメールボックスからメッセージを受信します。メッセージが無い場合は、5秒待ちます。
 | ヒント
receive() メソッドはESB Muleが対応している全てのトランスポートで使うことができます。ただし、一般的にリクエスト/レスポンスはキュー, ファイル・ディレクトリ, リポジトリや結果が戻されるSOAPの呼び出しのように、保管されているデータを検索する場合に使われます。 |
直接コンポーネントにイベントを送信する
ESB Muleクライントはプロバイダを使わずに、直接コンポーネントにイベントを送信することもできます。この機能はテストの時に便利ですが、JSPページやスクリプトからイベントを発生させる場合にも便利です。例えば、株価コンポーネントStockManagerに直接イベントを送る場合は、以下のようにコーディングします:
MuleClient client = new MuleClient();
UMOMessage result = client.sendDirect("StockManager", null, "give me the price of XXX", null);
StockQuote sq = (StockQuote)result.getPayload();
送信処理は sendDirect メソッドで行っています。そのメソッドを使うと、プロバイダを介さずに、コンポーネントが直接呼ばれます。そのために、トランスフォーマでデータ変換はされていません。トランスフォーマを使ってデータ変換を行う場合は、2番目の引数にコンマ「,」区切りでトランスフォーマを指定します。
クライアント・リモート・ディスパッチャ
The client can connect to, send and receive events from a remote Mule server. using the previous example -
MuleClient client = new MuleClient();
RemoteDispatcher dispatcher = client.getRemoteDispatcher("tcp:);
UMOMessage result = dispatcher.sendRemote("StockManager", null, "give me the price of XXX", null);
StockQuote sq = (StockQuote)result.getPayload();
ESB Muleクライアント(MuleClient)はリモート・サーバ上のStockManagerコンポーネントを実行し、結果をクライアントに戻します。ESB Muleが全てのデータ変換を行います。引数の最初のnullは結果のデータ形式を変換するたまのオプショナルなトランスフォーマの一覧です。引数の2番目のnullは、リクエストのプロパティの設定です。
多くの場合は、リモート・サーバからの結果を待ちたくはありません。そのような場合は直ぐに戻り値 FutureMessageResult を戻す asyncRemote() メソッドを使うことができます。
MuleClient client = new MuleClient();
RemoteDispatcher dispatcher = client.getRemoteDispatcher("tcp:);
FutureMessageResult result = dispatcher.asyncRemote("StockManager", null,
"give me the price of XXX", null);
StockQuote sq = (StockQuote)result.getMessage(1000).getPayload();
戻り値は、その後に実際の結果メッセージが戻された場合に使うための場所取りです。仮結果を取得することで、リモート呼び出しの処理が実行されている間に他を処理を実行することが出来ます。 getMessage() を使うと、結果が戻るまで待たなければなりません。タイムアウトするまでの待ち時間を指定することもできます(例でされているように)。結果が戻されたかを確認するためには result.isReady() メソッドを呼びます。
ESB Muleサーバはデフォルトでは tcp://localhost:60504 を使います。もし別のサーバにクライアントを接続させたい場合は、リモート・ディスパッチャを生成するときに指定します:
MuleClient client = new MuleClient();
RemoteDispatcher dispatcher = client.getRemoteDispatcher("http:);
MuleManagerの設定
ESB MuleManagerが非同期で実行されている場合に同期呼び出しを行うと client.send(..) 、戻り値は何時もnullになります。ESB Muleの内部で非同期で処理を行っているために結果がnullになります。以下のようにしてESB Muleが同期で実行されているかを確認できます:
boolean sync = MuleManager.getConfiguration().isSynchronous();
メッセージにプロパティを設定する
これまでの例では、プロパティを全て null に設定していました。パラメータの決まりはありません。メタデータを設定するのにも、トランスポート特有の設定もパラメータで行えます。次の例ではJMSとJMS特有の JMSReplyTo プロパティを使って非同期でリクエスト/レスポンスを行います:
MuleClient client = new MuleClient();
Map props = new HashMap();
props.put("JMSReplyTo", "replyTo.queue");
client.dispatch("jms:, "Test Client Dispatch message", props);
UMOMessage message = client.receive("jms:, 5000);
System.out.println(message.getPayload());
次の例は、クライアントを使ってメール・メッセージを送信します。件名と差出人はプロパティで設定されます。
 | ヒント
ESB Muleクライアントの相手はESB Muleサーバに限られていません。任意のアプリケーションをリクエストを送信することができます。 |
MuleClient client = new MuleClient();
Map props = new HashMap();
props.put("subject", "A message from mule");
props.put("fromAddress", "ross.mason@cubis.co.uk");
client.dispatch("smtp: endpoint=someone@somewhere.com", "Test Client Dispatch message", props);
SMTP接続情報をURLから省略したい場合は、以下のようにESB MuleのSMTPコネクタを設定することができます:
client.dispatch("smtp:, "Test Client Dispatch message", props);