BEA ホーム | 製品 | dev2dev | support | askBEA |
![]() |
![]() |
|
![]() |
e-docs > WebLogic Server > WebLogic File サービス ユーザーズ ガイド > WebLogic File サービスの使い方 |
WebLogic File サービス ユーザーズ ガイド
|
この章では、WebLogic File サービスについて説明します。内容は以下のとおりです。
WebLogic File サービスは、WebLogic Server 7.0 では非推奨です。 以下で説明するとおり、Java SDK java.net.URL.openConnection() メソッドを代わりに使用してください。
java.net パッケージを使用すると、JAR ディレクトリ内のファイルを参照できる java.net.JarURLConnection() メソッドが使用可能になるので便利です。 T3File インタフェースでは、JAR ディレクトリ内のファイルを参照することはできませんでした。
weblogic.io.common.T3File インタフェースの代わりとしての java.net パッケージ クラスの使い方
WebLogic File は、クライアント サイドからサーバ上のネイティブ オペレーティング システム ファイルへの高速なアクセスを実現します。クライアント API は、Java (java.io.InputStream と java.io.OutputStream) の最低限の共通機能を拡張したものです。そのため、リモート ファイルの操作に特化した追加サービスと一緒に、既存のコード内でシームレスに使用できます。
WebLogic File は、サービスとしてロギング、インスツルメンテーション、ワークスペースのような他のすべての WebLogic 機能も利用できます。File サービスを含む WebLogic のすべてのコンポーネント ベースのサービスは、WebLogic フレームワークに統合され、アクセスとリソースを共有できます。それらの API は、ネットワーク化された複雑なアプリケーションの構造を簡潔化する共通の側面を多数共有しています。アプリケーションでこれらのサービスを使用する場合、それらはオブジェクトへのアクセスとクライアント リソースを共有できます。
WebLogic File では、他の WebLogic サービスと同じように、クライアントはファクトリ メソッドを使用して T3FileInputStream と T3FileOutputStream オブジェクトを生成します。これらのクラスでは、既存のクライアント コードにプラグインできるように、標準 Java InputStream と OutputStream クラスを拡張しています。また、リモート ファイル ストリーム固有の追加メソッドも提供します。
WebLogic File は、要求のサイズとは無関係なサイズのバッファでのデータの送信や、readAhead と writeBehind バッファリングを使用することによって、ネットワークでの読み書きのパフォーマンスを高めます。この実装では、いくつかの方法でデータ送信速度を向上させます。
アプリケーションは、送信バッファ サイズ、データ先読みバッファ数、データ後書きバッファ数を指定することができ、デフォルト値を使用することもできます。デフォルトのバッファ サイズは 100K で、データ先読みバッファとデータ後書きバッファのデフォルトはどちらも 1 です。
WebLogic File によって設定されるデフォルト値は、一般に最高の速度を得るための最適値です。デフォルトを使用しない場合は、以下のヒントを参考にして他の値を選択してください。
このマニュアルには、WebLogic File API に固有の情報が記載されています。『WebLogic Server アプリケーションの開発』も参照してください。Java で初めて InputStream と OutputStream を扱う場合は、JavaSoft チュートリアルも参照してください。
weblogic.io.common パッケージは、以下のクラスとインタフェースで構成されています。
weblogic.io.common パッケージ
java.lang.Object クラス
weblogic.io.common.IOServicesDef インタフェース
java.io.InputStream クラス
weblogic.io.common.T3FileInputStream クラス
java.io.OutputStream クラス
weblogic.io.common.T3FileOutputStream クラス
weblogic.io.common.T3File インタフェース
weblogic.io.common.T3FileSystem インタフェース
java.lang.Throwable クラス
(java.io.Serializable を実装)
java.lang.Exception クラス
weblogic.common.T3Exception クラス
weblogic.io.common.T3FileSystem
weblogic.io.common.T3FileInputStream
weblogic.common.T3ServicesDef
T3ServicesDef t3services;
Hashtable env = new Hashtable();
env.put(Context.PROVIDER_URL, "t3://localhost:7001");
env.put(Context.INITIAL_CONTEXT_FACTORY,
weblogic.jndi.WLInitialContextFactory.class.getName());
Context ctx = new InitialContext(env);
t3services = (T3ServicesDef)
ctx.lookup("weblogic.common.T3Services");
ctx.close();
T3FileSystem myFS = t3services.io().getFileSystem("usr");
T3File myFile = myFS.getFile("myDirectory/myFilename");
T3FileOutputStream t3os = myFile.getFileOutputStream();
t3os.write(b);
ファイルを読み書きするための WebLogic Server の設定
WebLogic File サービスを使用する前に、クライアントが使用する 1 つまたは複数のパスのプレフィックス(fileSystem)を設定しておく必要があります。File T3 サービスの名前属性とパス属性は、Administration Console で設定します。たとえば、ファイル システム名 users をサーバ ホスト上のパス /usr/local/tmp にマップするには、名前を users、パスを /usr/local/tmp として指定します。
IOServicesDef ファクトリから T3FileSystem を要求するときは(最終的には T3File の作成と、入出力ストリームを使用した T3File の読み書きに使用される)、getFileSystem() メソッドの引数として登録されている fileSystem 名を使用します。返される T3FileSystem オブジェクトは、指定した fileSystem にマップされます。
セキュリティ上の理由から、T3Client はファイル システム名の一部として登録されている最下位のディレクトリよりも上位のディレクトリのファイルにはアクセスできません。ファイル名には、ドット ドット(..)を組み込むことはできません。これを行うと、例外が送出されます。たとえば、/users/../filename を読み出したり書き込んだりしようとすると、例外が発生します。
注意: Windows NT システム上のプロパティ ファイルでプロパティを設定するとき、シングル バックスラッシュ(¥)はエスケープ文字として解釈されるため使用できません。プロパティを設定するときにシングル バックスラッシュを使用すると、次のようなエラー メッセージが表示されます。
java.io.FileNotFoundException:Remote file name <filename> malformed
この場合、次の例のように、ダブル バックスラッシュを使用します。
weblogic.io.volume.vol=c:\\remote\\temp
または、代わりにパーサによって Window スタイルの構文に正しくマップされるフォワード スラッシュを使用してください。
weblogic.io.volume.vol=c:/remote/temp
以下の例では、リモートの T3File を読み書きするために必要な入出力ストリーム要求を取得する方法を示します。T3FileSystem インタフェースからリモート T3File を取得します。ここで、users は Administration Console を使って指定される fileSystem の名前で、WebLogic Server ホスト上の絶対パス /usr/local/users にマップされます。
T3ServicesDef t3services = getT3Services("t3://localhost:7001");
// IOServicesDef ファクトリから T3FileSystem オブジェクトを取得する
// 登録済み fileSystem を引数として指定する
T3FileSystem myFS = t3services.io().getFileSystem("users");
// T3FileSystem から T3File を取得する
T3File myFile = myFS.getFile("ben/notes");
// ファイルに書き出すための OutputStream を取得する
T3FileOutputStream t3os = myFile.getFileOutputStream();
// バイト「b」を OutputStream に書き出す
t3os.write(b);
このコードでは、1 バイトが作成され、WebLogic Server ホストのパス /usr/local/users/ben/notes にマップされるファイルに書き出されます。
getT3Services() メソッドは、weblogic.common.T3Client クラスに存在します。このメソッドは、クライアントに追加できます。
この簡単な例は、最も一般的な使い方を示したものです。ほかにも、最初に T3FileSystem または T3File オブジェクトを作成せずに、直接 T3FileInputStream または T3FileOutputStream を要求できる一連のコンビニエンス メソッドを使用して IOServicesDef ファクトリから特定の T3File 関連オブジェクトを要求する方法があります。
以下に、IOServicesDef ファクトリが提供するコンビニエンス メソッドの使用例を示します。
pathname 引数と一緒に getFileInput/OutputStream() メソッドを呼び出すことによって、IOServicesDef ファクトリから直接 T3FileInputStream または T3FileOutputStream オブジェクトを要求できます。次のようにします。
/registeredFileSystem/fileName
registeredFileSystem は Administration Console でパス属性として登録したマウントポイントで、fileName は宛先ファイルの名前です。
T3FileSystem 上で呼び出されたメソッドから T3FileInputStream または T3FileOutputStream オブジェクトを取得せず、直接そのオブジェクトを要求するときは、fileSystem の名前の先頭にスラッシュを挿入する必要があります。これを行わないと、サーバが次のようなエラーを生成します。
java.io.FileNotFoundException:Remote file name filename is relative
この T3FileInputStream オブジェクトは、デフォルトのバッファ サイズと readAhead を使用します。デフォルト設定のバッファ サイズと readAhead/writeBehind を使用しない場合は、別のファクトリ メソッドを使用してこれらの値を設定することができます。次の例では、InputStream オブジェクトは 1024 バイトのバッファ サイズと 3 つの readAhead バッファで作成されます。
int bufferSize = 1024;
int readAhead = 3;
T3ServicesDef t3services = getT3Services("t3://localhost:7001");
InputStream is =
t3services.io().getFileInputStream("/users/myfile",
bufferSize,
readAhead);
次の例では、OutputStream オブジェクトは 1024 バイトのバッファと 2 つの writeBehind バッファで作成されます。getT3Services() の詳細については、T3Services クラスの javadoc を参照してください。
int bufferSize = 1024;
int writeBehind = 2;
T3ServicesDef t3services = getT3Services("t3://localhost:7001");
Outputstream os =
t3services.io().getFileOutputStream("/users/myfile",
bufferSize,
writeBehind);
エラーが発生すると、そのファクトリ メソッドは例外 weblogic.common.T3Exception を送出します。これは、ネストされた例外の要因となります。
public int bufferSize();
public int writeBehind();
WebLogic File サービスを使用したプログラミング
次に、アプリケーション内で T3File 関連オブジェクトを要求して使用する方法について順を追って説明します。
プログラムにインポートするパッケージ以外にも、WebLogic File アプリケーションは以下のパッケージをインポートします。
import java.io.*;
import weblogic.common.*;
import weblogic.io.common.*;
手順 2. リモート T3Services インタフェースの取得
WebLogic クライアント アプリケーションから、WebLogic Server 上にある T3ServicesDef リモート ファクトリ インタフェース経由で T3File サービスにアクセスします。クライアントは、JNDI ルックアップを通して T3Services オブジェクトへのリモート スタブを取得します。getT3Services() というメソッドを定義してリストに登録します。このメソッドをクライアントに追加すると、T3Services スタブにアクセスできます。getT3Services() の詳細については、T3Services クラスの javadoc を参照してください。
次のように、WebLogic Server の URL を引数とするメソッドを簡単に呼び出すことができます。
T3ServicesDef t3services = getT3Services("t3://weblogicurl:7001")
手順 3. T3FileSystem と T3File の作成
一般に、ファイルの読み書きを開始するには、以下の手順を実行します。
IOServices ファクトリにアクセスするには、T3ServicesDef リモート インタフェースを使用します。IOServices ファクトリ getFileSystem() メソッドを呼び出して T3FileSystem オブジェクトを取得します。WebLogic Server 上に引数として登録されているファイル システム名を指定します。ファイル システムの登録は、Administration Console を使って行います。
この例では、ファイル システム プロパティとして名前が myFS、パスが /usr/local に設定されているものとします。
myFS にマップされる T3FileSystem に作成された T3File は、物理的には WebLogic Server のホストのディレクトリ /usr/local にデプロイされます。次に、T3FileSystem と test という名前の T3File を取得するコードを示します。
T3FileSystem t3fs =
t3services.io().getFileSystem("myFS");
T3File myFile = t3fs.getFile("test");
次に示すように、ファイルに読み書きする前にこのファイルが存在しているかどうかを調べることもできます。
if (myFile.exists()) {
System.out.println("The file already exists");
}
else {
// バイト配列を含んだファイルを作成する。次の手順で
// それを出力ストリームに書き出す
byte b[] = new byte[11];
b[0]='H'; b[1]='e'; b[2]='l'; b[3]='l'; b[4]='o'; b[5]=' ';
b[6]='W'; b[7]='o'; b[8]='r'; b[9]='l'; b[10]='d';
}
手順 4. OutputStream オブジェクトの作成と使用
前の手順では、WebLogic Server 上の T3File に書き込むバイトの配列を作成しました。通常、T3File を作成し、T3File.getOutputStream() メソッドで OutputStream を要求してその T3File に書き込みます。
次の例では、前の手順で作成した T3File myFile を使ってこのプロセスを示します。
Outputstream os =
myFile.getFileOutputStream();
os.write(b);
os.close();
OutputStream オブジェクトは、使い終わったら必ず閉じてください。
手順 5. InputStream オブジェクトの作成と使用
これで、読み出してその内容を確認する T3File を取得しました。OutputStream オブジェクトと同じパターンで、InputStream オブジェクトを要求して使用します。
ここでは、T3File の myFile からの読み出しを行うための InputStream オブジェクトを要求します。これにより、T3File への InputStream が開かれます。次の例では、バイトを読み込みます。まず、読み込むバイトの配列を割り当てます。この配列は、表示できる String を作成するために後で使用します。次に、以下に示すように java.io.InputStream クラスの標準メソッドを使用して、T3File から読み込みます。
byte b[] = new byte[11];
InputStream is = myFile.getFileInputStream();
is.read(b);
is.close();
ここで、表示する String を作成して結果を確認します。
String result = new String(b);
System.out.println("Read from file " + T3File.getName()
" on the WebLogic Server:");
System.out.println(result);
is.close();
InputStream オブジェクトは、使い終わったら必ず閉じてください。
この完全なコード例は、配布キットの examples/io ディレクトリに収められている実行可能なサンプルです。このコード例は、同じディレクトリに収められている指示に従ってコンパイルして実行できます。この例は、コマンド行から実行できるように main() メソッドを使用しています。
public class HelloWorld {
public static void main(String[] argv) {
// WebLogic Server URL、T3FileSystem 名
// および T3File 名の各文字列(String)
String url;
String fileSystemName;
String fileName;
// ユーザの入力をチェックし、正しければそれを使用する
if (argv.length == 2) {
url = argv[0];
// クライアント上のローカル ファイル システムを使用する
fileSystemName = "";
fileName = argv[1];
}
else if (argv.length == 3) {
url = argv[0];
fileSystemName = argv[1];
fileName = argv[2];
}
else {
System.out.println("Usage: java example.io.HelloWorld " +
"WebLogicURL fileSystemName fileName");
System.out.println("Example: java example.io.HelloWorld " +
"t3://localhost:7001 users test");
return;
}
// WebLogic Server からリモートの T3Services ファクトリを取得する
try {
T3Services t3services = getT3Services(url);
// ファイル システムとファイルを取得する
System.out.println("Getting the file system " + fileSystemName);
T3FileSystem fileSystem =
t3services.io().getFileSystem(fileSystemName);
System.out.println("Getting the file " + fileName);
T3File file = fileSystem.getFile(fileName);
if (file.exists()) {
// ファイルが存在しているので、何もしない
System.out.println("The file already exists");
}
else {
// ファイルが存在しないので、新たに作成する
byte b[] = new byte[11];
b[0]='H'; b[1]='e'; b[2]='l'; b[3]='l'; b[4]='o'; b[5]=' ';
b[6]='W'; b[7]='o'; b[8]='r'; b[9]='l'; b[10]='d';
// OutputStream を取得してファイルに書き出す
System.out.println("Writing to the file");
OutputStream os = file.getFileOutputStream();
os.write(b);
os.close();
}
// InputStream を取得してファイルから読み込む
byte b[] = new byte[11];
System.out.println("Reading from the file");
InputStream is = file.getFileInputStream();
is.read(b);
is.close();
// 結果をレポートする
String result = new String(b);
System.out.println("File contents is: " + result);
}
catch (Exception e) {
System.out.println("The following exception occurred " +
"while running the HelloWorld example.");
e.printStackTrace();
if (!fileSystemName.equals("")) {
System.out.println("Make sure the WebLogic server at " +
url + " was started with " +
"the property weblogic.io.fileSystem." +
fileSystemName + " set.");
}
}
}
private static T3ServicesDef getT3Services(String wlUrl)
throws javax.naming.NamingException
{
T3ServicesDef t3s;
Hashtable env = new Hashtable();
env.put(Context.PROVIDER_URL, wlUrl);
env.put(Context.INITIAL_CONTEXT_FACTORY,
weblogic.jndi.WLInitialContextFactory.class.getName());
Context ctx = new InitialContext(env);
t3s = (T3ServicesDef) ctx.lookup("weblogic.common.T3Services");
ctx.close();
return(t3s);
}
}
![]() |
![]() |
![]() |
![]() |
||
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |