さて、今回はデモの概要です(デモのダウンロードはServiceMix (1) JBIとServiceMix から)。
ビジネス概要
ダウンロードできるアプリケーションでは京都を題材にしてあります。京都を訪れたい人が、人数とグループ(家族/友達/男のみ/女のみ)を入力すると、地図上にその条件にあった情報を表示しします。あとは、情報の詳細をみたり、それらを任意に選び経路を表示させることができます。表示される情報は寺院の情報、イベントの情報、そして百貨店の情報です。

WindowsでJDK1.4.2以降が入っているなら、ダウンロードして解凍するだけですぐに試せるようになっています(Macはmaven経由でいけました。Linuxは文字化けしたらごめんなさい)。お試しください。
Web層の概要
Web層はいわゆるAjax(Asynchronous JavaScript + XML)です。地図はGoogle Mapsから読み込み、京都の情報はServiceMixからXML形式で取得しています。わかりやすいWeb2.0的Mush-upサイトでしょう。
Ajaxの作りを簡単に。ダウンロードしたフォルダのsrc\webappにあるmymap.js(UTF-8)を見てください。最下部のメソッドcreateMyMapは基本的なGoogle Mapsの実装をしています。つまりサーバがServiceMixであることは意識していません。ちょっと特別なのはリクエストでXMLをPOSTしている点だけです。
var request = GXmlHttp.create();
request.open('POST', '/exec/jbi/', true);
request.onreadystatechange = function() {
if (request.readyState == 4) {
//受信後の処理(マーカーをおいて、リストに追加)
}
}
request.setRequestHeader("content-type",
"application/x-www-form-urlencoded;charset=UTF-8");
request.send(DemoUtil.serializeRequestInfos(document.
getElementById('entryform')));
サーバロジックの概要
サーバには複数のInfoProviderというサービスがデプロイします。InfoProviderはユーザーが入力した条件をキーにして情報を返却します。今回は寺院の情報、イベントの情報、百貨店の情報を提供する3つのInfoProviderが存在します。ServiceMixはデプロイされた3つのInfoProviderを呼び出し、それらの情報を集積しています。
ServiceMix内の概要
ServiceMixで実行すべきことは、以下の2つです。
1.クライアントからのリクエストをJBIに流し込み
2.InfoProviderを呼び出し、その結果をまとめてレスポンス
まずは次の図を見てください(クリックで拡大図を表示)。
左側がブラウザになります。オレンジの丸がServletになっており、HTTPリクエストのストリームをそのままhttpBinding(Hb)に流し込みます。
httpBinding(Hb)はBindingComponentの役割を果たしておりMeesageExchangeに変換後、asyncForwarder(As)に渡します。
asyncForwarder(As)は、同期(InOut)から非同期(InOnly)への変換を行います。ご存知の通りHTTPは同期メッセージですが、InfoProviderを非同期実行させるために変換をする必要性があります。内部的には、受け取った同期メッセージを取っておきつつ、その内容をコピーして、findAggregator(Ag)に新しい非同期メッセージをしています。
findAggregator(Ag)は、指定された複数のService Engineにメッセージを非同期で送信し、それらの結果(XML)を全て集めて返却します。
今回の設定ではP1、P2がInfoProviderになります。そしてexP最後の1つだけに仕掛けがしてあります。exPは、そのままexServiceOutBound(OB)に処理を流しています。
exServiceOutBound(OB)は、HTTPでアウトバウンドを行うBindingComponentです。アウトバンド先は別サーバインスタンスのServiceMixになります。
別サーバインスタンスのServiceMixの中は、これまでの説明どおりの仕組みになっています。そして3つ目のInfoProvider(Pex)がデプロイされています。
つまりInfoProviderは全部で3つではありますが、2つが同インスタンス内に元々デプロイされているものですが、最後の1つだけは別サーバインスタンス内にあり、そことはHTTP(REST)を通じて処理を依頼しているのです。3つのInfoProviderを動かすためではありますが、必要な処理に分解していくと、このような形で実現することになります。
めんどうだなぁと感じるかもしれませんが、実はInfoProvider以外は全て汎用的なコンポーネントです。後でInfoProviderの説明をしますが中身はPOJOです。POJOを作成するだけで、あとは処理手順を組み合わせるだけでアプリケーションができていると考えると面白くありませんか?
これをServiceMix上で設定するためのservicemix.xmlを説明しようと思っていたのですが、長くなったので切ります。次回はservicemix.xmlです。

