ORACLE JAPAN Server Release 6.1

 

  |  

  WebLogic Server ホーム   |     ZAC ユーザーズ ガイド   |   前へ   |   次へ   |   目次   |   索引   |   PDF 版

WebLogic ZAC を使用した開発

 

この節では、ZAC(Zero Administration Client)用の API(Application Programmatic Interface)について説明します。内容は以下のとおりです。

 


はじめに

このマニュアルでは、ZAC API を使用して Java アプリケーションを ZAC 対応にする方法について説明します。また、WebLogic クライアント アプリケーションの作成についても説明します。この説明では、WebLogic 環境で使用できるすべてのサービスおよび機能を取り上げます。

WebLogic ZAC(Zero Administration Client)を使用すると、アプリケーション ソフトウェアの配布とメンテナンスを自動化できます。ソフトウェアの配布、インストール、再インストール、アップグレード、バグ修正パッチの配布、およびデータの配布を手動で行う手間を省くことができます。ZAC は、インターネットまたはイントラネットを経由して、クライアント マシン上のアプリケーション ソフトウェアを常に最新の状態に保ちます。ZAC のサービスは自動的に実行できる上に、エンドユーザに対して透過的です。ZAC は各クライアントを最新の状態にするために必要最小限の変更データだけを転送するので、更新は短時間で効率的に行われます。

ZAC は、W3C 仕様、 HTTP Distribution and Replication Protocol の実装です。GUI ウィザードの ZAC Publish Wizard を使用すると、ZAC 対応の WebLogic Server 上でソフトウェアを簡単にパブリッシュできます。また、ZAC には API も用意されており、同じ機能を直接 Java アプリケーションに組み込むことができます。ただし、Java HotSpot TM の有無にかかわらず、ZAC で 1.3.0 JDK を使用することはサポートされていません。

ZAC API をいつ使用するか

ZAC は、既存の Java アプレットおよびアプリケーションのラッパーとして使用したり、ZAC API を使用してアプリケーションに組み込んだりすることができます。ZAC を使用して Java ソフトウェアを配布して自動的に更新する場合、ZAC API を実際に使用する必要はありません。ZAC Publish Wizard を使用すると、アプリケーションをパブリッシュするために必要なすべての情報を指定し、クライアント マシンが使用できるようにして、自動更新ポリシーを設定できます。ZAC を使用したアプリケーションのパブリッシュの詳細については、「 WebLogic ZAC を使用したパブリッシュ」を参照してください。

アプリケーションで ZAC の更新サービスを厳密に制御する場合は、ZAC を Java コードに組み込むことを考慮する必要があります。アプリケーションでは、更新がパブリッシュされたときに自動的に応答することも、新しいソフトウェアを更新するタイミングをユーザが制御できるようにすることも可能です。ZAC API のもう 1 つの用途は、他のアプリケーションまたはクライアント マシン上の非実行可能データの更新を管理するアプリケーションを作成することです。たとえば、現場の各営業担当者のラップトップ上で大規模な社内イントラネットの情報を最新の状態に保つ場合のように、各クライアント マシン上で大きなデータセットを管理するとします。変更のたびにデータセット全体をネットワーク経由でダウンロードすると時間がかかりますが、ZAC 対応アプリケーションでは、新しくパブリッシュされたバージョンを見つけると、変更された部分だけがダウンロードされます。

ZAC がアプリケーションをデプロイする方法

ZAC アプリケーションを WebLogic クライアントが使用できるようにするには、ZAC 対応 WebLogic Server 上でパブリッシュする必要があります。ZAC でアプリケーションをパブリッシュするためにアプリケーション コード内に ZAC Java API を使用する必要はありません。パブリッシュ手順の中で、ZAC はクライアントがダウンロード可能な小さなブートストラップ実行可能ファイルを提供し、そのブートストラップが初期ダウンロードと、その後の更新処理(コンフィグレーション可能)、およびパブリッシュされたアプリケーションの起動を行います。このブートストラップ実行可能ファイルは、対象オペレーティング システムごとにコンパイルされます。そのため、Java をクライアント上にプリインストールしておく必要はありません。

ブートストラップをパブリッシュするには、Web ページからその実行可能ファイルへのリンクを張ります。ユーザがブートストラップをダウンロードして実行したら、デスクトップにアイコンがインストールされます。このアイコンをダブルクリックすると、アプリケーションの初期インストールが開始され、次いでアプリケーションが起動されます。パブリッシュされたアプリケーションを起動する前に、ブートストラップは、サーバ上に更新がないかチェックして、必要に応じてアプリケーションを更新します。変更分だけがダウンロードされるので、更新のチェックに続いて更新処理も行う方が効率的です。

ZAC API を使用して コードを Java クライアントに追加すると、アプリケーションを更新するタイミングをさらに細かく制御することができます。ブートストラップを ZAC Publish Wizard で生成する場合(「 Publish Wizard の使い方」を参照)、オプションのチェックをはずせるので、クライアントは新しくパブリッシュされた ZAC パッケージを自動的には更新しません。代わりに、ZAC 更新機能をアプリケーション自体に追加すると、ユーザがアプリケーションのユーザ インタフェースを利用していつアプリケーションを更新するかを選択できるようになります。

 


WebLogic ZAC API

Package-weblogic.zac

Class java.lang.Object
Class weblogic.zac.ZAC
(implements weblogic.drp.events.ProgressListener,
weblogic.drp.common.DRPConstants)
Class weblogic.zac.ZACLog

ZAC クラスを使用して、アプリケーション内からクライアント マシン上の ZAC パッケージを管理します。一般には、update() メソッドなど、このクラスのメソッドのごく小さなセットを使用するだけで、パブリッシュ側 WebLogic Server からクライアント マシン上の ZAC パッケージを更新できます。

ZACLog クラスは、クライアントが使用しているパブリッシュ済み ZAC パッケージと、各パッケージの最新の更新についての情報を提供します。

 


WebLogic ZAC を使用した実装

この節では以下の内容について説明します。

パッケージをインポートする

ZAC クラスを Java アプリケーションまたはアプレットで使用するには、WebLogic ZAC パッケージだけでなく、すべての WebLogic クライアントをサポートするパッケージもインポートする必要があります。次に例を示します。

import weblogic.zac.*;
import weblogic.common.*;

ZAC アプリケーションを更新する

アプリケーションでは、ZAC パッケージを参照して更新するために、ZAC オブジェクトを作成および使用します。ZAC コンストラクタには、管理する ZAC パッケージについて以下の詳細を指定する必要があります。

ZACLog クラスを使用すると、クライアント アプリケーションで使用している各 ZAC パッケージについての情報を取得してから、その情報を ZAC コンストラクタに渡すことができます。この処理を行う方法を以下のコードで説明します。

// パブリッシュする各サーバのアドレスを見つけて
// それぞれに順に接続する
ZACLog zl;
ZAC zac;
// このアプリケーションが依存しているパブリッシュ済み
// パッケージごとの ZACLog の列挙値を取得する
Enumeration enum = ZACLog.getUpdateLogs();
while (enum.hasMoreElements()) {
zl = (ZACLog)enum.nextElement();
// 各 ZACLog を基にサーバ アドレスの URL を作成する
t3url = "t3://" + zl.getZACHost() + ":" + zl.getZACPort() + '/';
// 新しい ZAC オブジェクトを作成して、サーバに接続する
zac = new ZAC(zl.getZACHost(),
zl.getZACPort(),
zl.getZACName(),
zl.getLocalDirectory());
// ZAC パッケージの更新を実行する
zac.update();
}

上記の例では、列挙された ZACLog インスタンスを調べるために、ZACLog.getUpdateLogs() メソッドを使用しています。各 ZACLog インスタンスは、このアプリケーションが依存している別々の ZAC パッケージを参照しています。各 ZACLog のプロパティを使用して、各 ZAC パッケージの ZAC オブジェクトを作成します。次に、zac.update() メソッドを使用して、各 ZAC パッケージを更新します。

アプリケーションが依存している以外の別の ZAC パッケージを管理する場合、ZACLog.getUpdateLogs() メソッドは、現在の ZAC アプリケーションが使用している各パッケージの ZACLog だけを返すので、効果がありません。この場合には、アプリケーションで、パブリッシュ側 WebLogic Server に関する明示的な詳細とパッケージの名前をコンストラクタに渡す必要があります。

ZAC オブジェクトを作成したら、その update() メソッドを呼び出すことができます。このメソッドは ZAC パッケージが新しくパブリッシュされていないかチェックして、必要に応じてクライアントのパッケージを更新します。

ZACLog を使用して最新の更新を問い合わせる

各 ZAC 更新の詳細は、一連の ZACLog オブジェクトに記録されます。更新が行われるのは、アプリケーションが起動するときやアプリケーションが更新自体を初期化するときです(上記参照)。静的メソッドである ZACLog.getUpdateLogs() を使用して最新の更新から ZACLog オブジェクトの列挙値を取得します。以前の ZACLog レコードはすべて破棄されます。アプリケーションは、必要に応じて更新レコードを保守しなければなりません。

getUpdateLogs() メソッドを呼び出して返された列挙値には、アプリケーションが依存している各パッケージにつき 1 つの ZACLog が入っています。この列挙値を以下のコードで処理します。

// ZACLog の列挙値を取得する
Enumeration enum = ZACLog.getUpdateLogs();
ZACLog zl;
// 各 ZACLog を処理する
while(enum.hasMoreElements()) {
zl = (ZACLog)enum.nextElement();
// ZAC パッケージ名を出力する
System.out.println("ZAC log for package" + zl.getZACName());

// ZAC の更新ステータスを出力する
switch(zl.getUpdateStatus()) {
case ZACLog.UPDATE_NONE:
System.out.println("ZAC update status: No update was necessary.");
break;
case ZACLog.UPDATE_FAILURE:
System.out.println("ZAC update status: FAILED!");
System.out.println("Details: " + zl.getUpdateFailureString());
break;

// ここから実際の処理が開始される
case ZACLog.UPDATE_SUCCESS:
System.out.println("ZAC update status: Completed successfully");

// 更新についての情報を取得する
int fileCnt = zl.getUpdateFileCount();
long binarySize = zl.getUpdateByteCount();

String details;

if (fileCnt == 0) {
details = "Update Success, 0 files updated, 0 bytes transferred.";
}
else {
if (fileCnt == 1) {
details = "Update Success, 1 file updated, ";
}
else {
details = "Update Success, " + fileCnt + " files updated, ";
}

if (binarySize > 1000) {
details += (binarySize / 1000) + " KBytes transferred.";
}
else {
details += (binarySize) + " bytes transferred.";
}
}
System.out.println("Details: " + details);

// 更新されたファイルが報告される
System.out.println("The following files were updated:");
Enumeration fl = zl.getUpdateFileList();
File zacroot = zl.getLocalDirectory();
while (fl.hasMoreElements()) {
String path = (String)fl.nextElement();
File updated = new File(zacroot, path);
System.out.println("Updated: " + updated.getAbsolutePath());
}
}
}

この例は、ZACLog から最新の ZAC 更新についての情報を取得する方法を示しています。まず、ZACLog が参照している ZAC パッケージの名前を取得して、コンソールに出力します。次に、ZAC 更新のステータスを問い合わせ、その結果に基づいて switch 文で処理を実行します。getUpdateStatus() メソッドは以下のいずれかの定数を返します。

ZACLog.UPDATE_NONE

更新の必要はありません。パッケージは最新です。

ZACLog.UPDATE_FAILURE

更新に失敗しました。失敗した理由を調べるには、 getUpdateFailureString() メソッドおよび getUpdateFailure() メソッドを呼び出します。これらのメソッドは、スタック トレースを格納する文字列と発生した Throwable 例外をそれぞれ返します。更新が失敗する原因としては、サーバ エラー、通信の中断、クライアント マシンのディスク容量不足などが考えられます。

ZACLog.UPDATE_SUCCESS

更新が成功したことを示します。更新が成功した場合には、 ZACLog について、転送データのサイズや更新されたファイルなどの情報も取得できます。

getUpdateFileList() メソッドによって返される更新済みファイルの名前は、ZAC パッケージのインストール ディレクトリを起点としています。上記の例の場合、FILE オブジェクトは相対パス名で構築されているので、getLocalDirectory() メソッドによって返されるパスに追加すると、各ファイルの絶対パス名になります。

更新によってアプリケーションに適用された変更は、アプリケーションを再起動するまで有効になりません。

ZAC クライアント アプリケーションを再起動する

クライアント アプリケーションが ZAC ブートストラップによって起動された場合、ZAC.ZAC_EXIT_RESTART フラグを System.exit() メソッドに送信することで、アプリケーションの再起動を要求できます。次に例を示します。

System.exit(ZAC.ZAC_EXIT_RESTART);

ZAC ブートストラップを使用してアプリケーションを起動したので、ブートストラップで終了ステータスを取得することもできます。ZAC.ZAC_EXIT_RESTART ステータスを取得すると、ブートストラップはアプリケーションを再起動します。ブートストラップは、コンフィグレーションによって、再起動する前にアプリケーションとアプリケーションが依存する他の ZAC パッケージの更新処理も実行します。このコンフィグレーションは、ZAC Publish Wizard を使用してアプリケーションをパブリッシュするときに行います。

ZAC で WebLogic Event を使用する

WebLogic Event をクライアント アプリケーションに組み込むと、新しいバージョンの ZAC パッケージが WebLogic Server 上でパブリッシュされた場合に、クライアント アプリケーションがすぐに応答できるようにすることができます。

注意: WebLogic Event は、WebLogic Server リリース 6.0 より非推奨になりました。

WebLogic Server は、myPackage という新しいパッケージの更新が WebLogic Server 上でパブリッシュされると、WEBLOGIC.ZAC.UPDATE.myPackage トピックの新しいイベントを生成します。アプリケーションでイベント トピック WEBLOGIC.ZAC.UPDATE に関係を登録して、sink フラグを true に設定すると、新しいバージョンのパッケージがパブリッシュされたときにアプリケーションに通知されます。イベントの詳細については、『WebLogic Event ユーザーズ ガイド』を参照してください。

次のコードは、クライアントが WebLogic Server に接続して、ZAC パッケージのパブリッシュに関係を登録する方法を示しています。この例では、クライアントは "WEBLOGIC.ZAC.UPDATE.myPackage" イベント トピックに関係を登録します。

ZACLog zl;
String t3url = null;
while (enum.hasMoreElements()) {
ZACLog zl = (ZACLog)enum.nextElement();
// パッケージ名と一致するかどうかをテストする
if (zl.getZACName().equals("myPackage")) {
t3url = "t3://" + zl.getZACHost() +
":" + zl.getZACPort() + '/';
break;
}
}

if (t3url != null) {
// ここでサーバに接続する
T3ServicesDef t3services = getT3Services(t3url);

// 更新イベントへの関心を登録する
// 登録で使用される Evaluate オブジェクトを作成する
Evaluate eval =
new Evaluate("weblogic.event.evaluators.EvaluateTrue");

// 登録用の Action オブジェクト パラメータを作成する。
// クライアントに通知が返されるようにするには、クライアントが
// ActionDef を実装し、Action が「this」などの
// オブジェクトを使用してインスタンス化される必要がある
Action act = new Action(this);
// EventRegistrationDef オブジェクトを作成する
EventRegistrationDef erd =
t3services.events()
.getEventRegistration("WEBLOGIC.ZAC.UPDATE.myPackage",
eval, act, true, true, 1);

// 最後に、イベントへの関心を登録する
int regid = erd.register();
}

クライアントには、ActionDef インタフェースの一部である action() メソッドを実装する必要があります。action() メソッドでは、クライアントは、更新がパブリッシュされたことを示す通知に基づいて処理を行い、自身を更新することができます。次に例を示します。

public synchronized void action(EventMessageDef ev) {
System.out.println("Notification of an " +
ev.getTopic() +
" Event received.");
zacUpdate = true;
notifyAll();
}

通常、action() メソッドは同期され、複数のスレッドを同時に実行することを防ぎます。この実装では、メッセージをコンソールに出力して、private 変数 zacUpdatetrue に設定し、イベントを処理するために、notifyAll() メソッドで他のアプリケーション スレッドに通知しています。zacUpdate 変数は、ZAC 更新を実行する停止中のアプリケーション スレッドに通知されます。

注意: イベントの通知は別のスレッドから呼び出されるので、この例のように、コールバック メソッドで時間のかかる処理を実行することは避けてください。すぐに復帰する小さな処理は実行してもかまいませんが、この例では、比較的時間のかかる処理である ZAC 更新をクライアント アプリケーション スレッドの 1 つで処理するのが最適であると判断しています。

ZAC アプリケーションと一緒にライブラリをパッケージ化する

ZAC アプリケーションをパブリッシュする場合は、必要なライブラリもすべてパブリッシュしなければなりません。Weblogic クラスの ZAC サブセットは、ZAC アプリケーションと一緒にデフォルトで配布され、アプリケーションが ZAC API を使用しているかどうかにかかわりなく、アプリケーションの操作に必要となります。これらのクラスは zac.jar ファイルとしてクライアントにダウンロードされ、ZAC アプリケーションのインストール ディレクトリの下の lib ディレクトリに格納されます。ZAC クラスはデフォルトで提供されるので、ZAC API を使用するアプリケーションはこれらのクラスをデプロイする必要がありません。

ただし、zac.jar ファイルに入っていない WebLogic リソース、またはデフォルト以外のライブラリやパッケージを使用するアプリケーションの場合は、それらのリソースもクライアント マシン上にインストールされるようにコンフィグレーションする必要があります。この処理を行う方法は以下の 2 通りです。

ZAC パッケージにライブラリを含める

必要なクラス、jar、ライブラリなど、ZAC アプリケーションのパブリッシュ ディレクトリの下にあるすべてのデータを含めた場合、それらはパッケージと一緒に自動的にデプロイされ、クライアント マシン上で同じ相対パッケージ ディレクトリの下にインストールされます。

アプリケーションがアプリケーション パッケージに入っていないクラスに依存する場合、それらのクラスを ZAC アプリケーションの CLASSPATH に指定する必要があります。ZAC Publish Wizard でアプリケーションの実行時 CLASSPATH を指定する(「 Publish Wizard の使い方」参照)ことが可能です。CLASSPATH は、ルート インストール ディレクトリを起点に指定します。

ZAC パッケージと別の ZAC パッケージとの間に依存関係を設定する

同じライブラリまたはクラスを使用する複数の ZAC アプリケーションをパブリッシュする場合は、共有コンポーネントを別のパッケージとしてパブリッシュすると、クライアント マシン上のディスク領域を節約できます。その上で、各パッケージと共有パッケージとの依存関係を構築します。アプリケーションが依存するパッケージは、アプリケーション自体も含めて、クライアント アプリケーションが更新されるたびに一緒に更新されます。

ZAC がクライアント上にパッケージをインストールすると、すべてのものがルート ディレクトリの下にインストールされます。最初にパブリッシュした ZAC アプリケーションは、このルート ディレクトリの下のサブディレクトリに同じ名前でインストールされます。その他のパッケージもすべて、このルート ディレクトリの下のパッケージと同じ名前のサブディレクトリに格納されます。ZAC は、ルート ディレクトリにインストールされたという情報だけを持ちます。インストールルート ディレクトリの場所は、パッケージをパブリッシュするときに定義されるか、またはパッケージのコンフィグレーションによって可能な場合にユーザがインストール時に指定します。


 

この例では、ZAC ルート ディレクトリは ZacExamples で、2 つのパッケージ、ZSimple と WeblogicClasses を格納しています。この場合、ZSimple パッケージが WeblogicClasses に依存している可能性があります。

2 つのZAC パッケージが別のパッケージに依存している場合、どちらの ZAC パッケージも同じルート ディレクトリの下にインストールする必要があります。


 

この図は、AnotherOne という別のパッケージが同じルート ディレクトリの下にインストールされたときのディレクトリ構造を示 しています。どちらのパッケージも同じ WeblogicClasses パッケージに依存しており、必要であればどちらも更新されます。

注意: 同じルートにインストールされていない場合は、それぞれが同じパッケージの別々のコピーを、対応するルート ディレクトリの下に保持します。これは、別のパッケージが依存するパッケージを ZAC パッケージが更新してしまうことがないようにするためのデフォルト動作です。

 

back to top previous page