レベル: 初級 Christopher Vincent, Software Engineer, Internet Technology Team, IBM Server Group
2002年 11月 01日
IBM Lightweight Services (LWS) を使用すると、スクリプト開発者はWebSphereプラットフォームでプロセス指向のサービスの作成、デプロイ、デバッグを迅速に行うことができます。これらのスクリプト・ベースのサービスは、IBMのミドルウェアと統合し、J2EEアプリケーションを拡張してインスタント・メッセージングなどの非トランザクション・リソースにアクセスできるようにします。この記事では、LWSの概要を説明します。LWSについては、IBMのalphaWorks のサイトで評価版を入手することができます。
このシリーズの第2回 「スクリプト・ベースのエージェントによるJ2EEの拡張」では、従来型のJ2EEアプリケーションを拡張して軽量サービスを組み込む方法、およびシステムの各ユーザー用のエージェント・インスタンスを作成、管理する方法を示します。
軽量サービスとは何か ?
IBM Lightweight Services (LWS) は、JavaScriptなどの軽量プログラミング言語で開発された長時間実行されるサーバー・サイド・プログラムです。JavaScriptが軽量言語 と見なされるのは、これが比較的簡単で、習得や使用が容易だからです。JavaScriptはDHTMLと連携することが多く、イベント・ドリブン・スクリプト言語としてWebページで使用されます。LWSでは、JavaScriptを高水準ダイナミック言語として使用し、Webサービス、Sametimeインスタント・メッセージング、および高性能なPublish/Subscribeを利用したサーバー・サイドの処理を開発します。
エージェント
LWSは特に、個人向けサービス、つまり個別のユーザーに代わって動作するサーバー・サイドのアプリケーション開発に適しています。このプログラミング・スタイルを認識して、エージェント はサーバーにインストール済みのプログラムを、エージェント・インスタンス はそのプログラムを実行するコピーを意味する用語として使用されます。エージェント・インスタンスは個々に作成、初期化され、多様なセキュリティー属性を有する様々なユーザーにサービスを提供するよう構成することができます。
エージェントは、必要とする実行環境と著者やバージョン情報などのメタデータの情報と対になったスクリプトから構成されます。エージェントがインストールされると、これらのリソースがサーバーにコピーされ、LWSデータベースに格納されます。これで、クライアントは、それぞれ独自の構成とプログラム状態を有するエージェント・インスタンスを作成することができます。
以下の簡単なJavaScriptプログラムについて考えてみましょう。
var phoneNumbers = new Object();
function setPhoneNumber(name, number) {
phoneNumbers[name] = number;
}
function getPhoneNumber(name) {
return phoneNumbers[name];
}
|
このJavaScriptコードが初期化されると、最上位のプロパティーphoneNumbers が汎用オブジェクトで設定され、このオブジェクトはハッシュ・テーブルとして使用されます。プログラムが初期化されると、2つの関数のいずれかが呼び出されるまでコードが実行されないことに注意してください。エージェント・スクリプトには「メインループ」や長時間実行される最上位コマンドのシーケンスはありません。エージェント・スクリプトは簡単な初期化コードとイベント・ハンドラーとして機能するJavaScript関数で構成されます。
トランザクション
このスタイルのスクリプトはWebページ開発者にはおなじみですが、LWSではいくつか重要な新機能が導入されています。LWSはトランザクショナルでかつ永続的なプログラミング環境を提供します。これらはサーバーの処理を調整する強力でフォールト・トレラントなスクリプトの開発のために重要な機能です。この記事の後段で、Webサービス・クライアントによって上記のJavaScript機能を呼び出す方法について説明します。これらの機能は、呼び出されるとWebSphereトランザクション内で実行されます。例えば、JavaScriptエラーがsetPhoneNumber 関数で起こった場合、phoneNumbers プロパティーへの変更はすべてロールバックされる、つまり取り消されます。
各エージェント・インスタンスの状態は各イベント間にデータベースに格納されるので、トランザクション処理を行うようなJavaScriptを書くことが可能です。このことは、スクリプト・エラーから保護するということに加えて、スクリプトのプログラム状態がサーバー障害の間中ずっと有効であることを意味します。上記の例では、phoneNumbers プロパティーの値はWebSphereが再始動された後でも保持されます。
トランザクションのJavaScriptはエラーの回復に役立ちますが、非トランザクションのアプリケーションと通信するエージェントはどうでしょうか。Sametimeインスタント・メッセージングを例に取ると、このアプリケーションでは、メッセージ送信などの操作はロールバックできません。この問題に対処するために、LWSでは、非トランザクション・リソースからの分離が行われます。エージェントが利用可能なAPIの多くは非同期であり、結果またはエラー状態は新しい別のトランザクションのイベント・ハンドラーによって処理されます。このプログラミング・スタイルのおかげで、操作の多くを現行のトランザクションの終了まで遅延させることができます。例えば、1つのJavaScriptイベント処理の過程で、2つのSametimeメッセージが送信される場合、最上位のイベント・ハンドラーが正常な値を返すまでは、インスタント・メッセージング・サーバーには何も送信されません。JavaScriptエラーが発生した場合、メッセージは破棄されます。
拡張
標準JavaScript (ECMAScript参考文献参照) は、基本プログラミング言語を定義しますが、他のアプリケーションと通信するための関数を含みません。Webページでは、JavaScriptはHTML要素およびブラウザー機能を表すオブジェクトで拡張されます。LWSは、Webサービス、Sametimeインスタント・メッセージング、および高性能Publish/Subscribeによる通信のためのJavaScript拡張を提供します。例えば、LWS開発者がWebServices Extensionを用いることを指定した場合、WebServices という名前のオブジェクトが最上位プロパティーとして追加されます。このオブジェクトは、リモートのWebサービスを呼び出して、応答を処理するためのJavaScriptAPIを持っています。
WebServices Extensionがとりわけ興味深いのは、これによってエージェントがWebサービスの利用者と提供者の両方として機能できるためです。サービスを利用する、つまりWebサービス・クライアントとして機能するためには、エージェント・スクリプトは (Web Services Description Language (WSDL) を用いて、または用いずに) 要求オブジェクトを構成し、非同期的にリモートのサーバーを呼び出します。
Webサービスを提供するためには、開発者はLWSツールで一連のJavaScript関数をWebサービス操作としてエクスポートします。Javaのメソッドとは異なり、JavaScript関数のパラメーターは型情報を指定しません。しかし、この情報をLWSに付加的に与えて、JavaScript関数が特定のSOAP(Simple Object Access Protocol) 型を受け入れたり返したりできるようにすることは可能です。下の図1 はWebSphere Studio Application DeveloperのLWSパースペクティブでWebサービスの関数を公開させる方法を示しています。
図1. Webサービスの関数を表示させる
ランタイム
この記事ではJavaScriptでのサービス開発を中心に説明していますが、LWSは複数のランタイムをもサポートしています。ランタイムはコードの実行とエージェント・インスタンスのプログラム状態の保存を担当し、新規のLWSプロジェクト作成時にエージェントの開発者によって選択されます。LWSにはMozilla Rhinoエンジン (参考文献を参照) に基づくJavaScript固有のランタイムと、IBMのBean Scripting Framework (BSF、参考文献を参照) に基づくランタイムとを含んでいます。Rhino RuntimeがJavaScriptコンストラクターやDHTMLスタイルのイベント・ハンドラーなどの先進機能をサポートしているのに対し、BSFRuntimeは数種類のスクリプト言語から選択することができます。両方ともJavaScriptをサポートしていますが、これら2つのランタイム用に開発されたスクリプトには相当な違いがあることに注意してください。LWS配布時には、インタープリタ言語であるPythonで開発されたBSFの用例が含まれています。
アプリケーション
LWSは、開発しているものがワークフロー・エスカレーション・エージェントであれ、CRMシステムであれ、あるいはその他のユーザー中心のアプリケーションであれ、ユーザーとの対話に最適です。これらのシナリオでは、開発者は通常、特定のプロセスまたはタスクを取り扱うためのエージェントをインストールすることになります。その場合、エンタープライズ・アプリケーションはそのエージェントの新しいインスタンスを各ユーザー用に作成するか、またはプロセスのインスタンスを作成し、その特定のタスクの詳細を含む構成データを提供します。
上記の電話帳スクリプトを使用して、Enterprise JavaBeansテクノロジーで実装される可能性のあるサービスを即座にプロトタイプ化することができます。また、LWSを使用して、従来型のWebSphereアプリケーションに、以下のようなJ2EE1.2で一般には利用できない関数を補足することもできます。
- セルフ・スケジューリング (スクリプト・イベントを周期的に起動するタイマーを作成する)
- 非同期的なWebサービス呼び出し
- Sametimeインスタント・メッセージング・サーバーへのログイン
これらの機能によって、LWSはWebサービス・クライアント操作全体のスクリプト記述を容易にします。簡単なエージェントで複数のWebサービス要求を同時にディスパッチし、結果を集計し、ユーザーに通知するとともに、障害が発生した際には訂正処置を行うことが可能になります。
エージェントの開発
LWSにはIBM WebSphere Studio Application Developer用の新しいパースペクティブが含まれており、ユーザーはこれでエージェントの修正、インストール、およびデバッグを迅速に行うことができます。このエージェント・インスタンスの保存方法により、エージェントを新たにインストールまたは修正しても、基盤となるデータベース・スキーマを修正する必要はありません。下の図2 のインストール (Install)ボタンを押すことによって、即座に次のタスクが完了します。
- 現在のデバッグ・セッションで、先に作成されたエージェントのインスタンスがあればそれを除去する。
- リモートのLWSサーバー上のエージェントをインストール (または再インストール) する。
- 指定された構成情報で新しいエージェント・インスタンスを作成する。
- 新しいエージェント・インスタンスと対話するためのコマンド・ライン・ウィンドウを開く。
- 新しいインスタンスのデバッグ出力を監視するための新しいログ・ウィンドウを開く。
図2. インストール画面
電話帳サービスの例では、Command Line画面でエージェント・コードを直ちにテストすることができます。ユーザーがJavaScriptの式を入力すると、その式は、サーバー上で、選択されたエージェント・インスタンスのコンテキスト内と新しいトランザクションで評価されます。入力した関数が予期した通り機能することが確認されれば、Webサービスとしてそのエージェント・インスタンスを呼び出してみてください。alphaWorksのLWSのリリース (参考文献を参照) には、このタスクやその他のタスクについてのチュートリアルが含まれています。
結論
LWSが、サービスを迅速にプロトタイプ化し、Lotus Sametimeインスタント・メッセージングなどの非同期の非トランザクション・ミドルウェアとJ2EEアプリケーションを統合する上で役立つことがお分かりいただけると思います。LWSの評価を行いたい場合は、IBMのalphaWorks Webサイト (参考文献を参照) からサーバー、開発ツール、および資料をダウンロードすることができます。alphaWorksリリースには、エージェントの開発のためのチュートリアルがいくつか含まれています。
従来型のJ2EEエンタープライズ・アプリケーションを拡張して軽量サービスを組み込む方法、およびシステムの各ユーザー用のエージェント・インスタンスを作成、管理する方法をお知りになりたい場合は、このシリーズの第2回「スクリプト・ベースのエージェントによるJ2EEの拡張」を参照してください。
参考文献
著者について  | |  | Christopher Vincent氏は、IBM Server Group、インターネット・テクノロジー・チームのソフトウェア・エンジニアです。Vincent氏の研究対象は、インスタント・メッセージング、Publish/Subscribeインフラストラクチャー、RAD(迅速なアプリケーション開発)、およびプログラミング・プログラム言語などです。氏はマサチューセッツ工科大学 (MIT) で工学修士および理学学士の学位を取得しており、同大学の人工知能研究所に在籍していました。 |
記事の評価
|