Java 

RMI リリースノート
J2SETM 1.4

ドキュメントの目次
J2SETM 1.4 の既知の問題点
IllegalStateException トレースが RMI サーバ仮想マシンによって出力される
エクスポートされたリモートオブジェクトを持つ仮想マシンが高負荷時にリモート呼び出しを受け取ると、次の例と同様の例外トレースが System.err に出力されることがあります。
java.lang.IllegalStateException: Task already scheduled or cancelled
        at java.util.Timer.sched(Timer.java:316)
        at java.util.Timer.schedule(Timer.java:128)
        at sun.rmi.transport.DGCAckHandler.startTimer(DGCAckHandler.java:84)
        at sun.rmi.transport.ConnectionOutputStream.done(ConnectionOutputStream.java:82)
        at sun.rmi.transport.StreamRemoteCall.releaseOutputStream(StreamRemoteCall.java:94)
        at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:302)
        at sun.rmi.transport.Transport$1.run(Transport.java:148)
        at java.security.AccessController.doPrivileged(Native Method)
        at sun.rmi.transport.Transport.serviceCall(Transport.java:144)
        at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:460)
        at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:701)
        at java.lang.Thread.run(Thread.java:536)
通常はこの例外が発生しても害はありませんが、クライアントが間を置かずにリモート呼び出しを試みると、この例外の発生によってその後のクライアントのリモート呼び出しが java.io.EOFException を含む java.rmi.UnmarshalException によって失敗することがあります。この場合は、失敗したリモート呼び出しの再試行が続きます。この問題は、次回の保守リリースで修正される予定です。
J2SETM 1.4 の RMI の拡張機能
サーバ側スタックトレースがリモートの例外に保持される
RMI ランタイム実装が、以前のリリースで行っていたようにクライアント側スタックトレースを記入するだけでなく、リモート呼び出しからスローされる例外のサーバ側スタックトレース情報を保持するようになりました。したがって、そのような例外がクライアントコードにアクセス可能になると、そのスタックトレースには、元のサーバ側トレースデータと、それに続くクライアント側トレースのすべてが含まれることになります。

この機能は、J2SE 1.4 の java.lang.Throwable の新しい「スタックトレース情報へのプログラムによるアクセス」機能によって可能になりました。これには、デフォルトの直列化形式の Throwable のスタックトレースデータ部分の作成が含まれます。クライアント側 RMI ランタイム実装は、この機能と連携するために、以前のリリースのように、単にクライアント側トレースで上書きするのではなく、クライアント側トレースを、非整列化されたサーバ側トレースに追加します。

パフォーマンスまたは機密性に関する理由により、RMI サーバアプリケーションによっては、リモート呼び出しの結果 (J2SE 1.4 の例外のデフォルトの直列化形式の一部として)、整列化される例外に、サーバ側スタックトレースデータが付随することを防ぐ必要がある場合があります。そのような場合は、実装に固有のシステムプロパティである

sun.rmi.server.suppressStackTraces
を「true」に設定すると、サーバ側 RMI ランタイム実装によって、リモートメソッドの呼び出しの結果、現在の仮想マシンからスローされたすべての例外のスタックトレースが消去されます。

RMIClassLoader 用サービスプロバイダインタフェース
java.rmi.server.RMIClassLoader の一部の static メソッドの動作は、新しいサービスプロバイダインタフェース java.rmi.server.RMIClassLoaderSpi のインスタンスに委譲されています。サービスプロバイダを設定して、指定したアプリケーションに対する RMI の動的クラスローディングの動作を強化することができます。デフォルトでは、サービスプロバイダは、RMIClassLoader の static メソッドすべての標準動作を実装しています。詳細については、RMIClassLoader および RMIClassLoaderSpi のクラスドキュメントを参照してください。

動的なサーバホスト名
java.rmi.server.hostname プロパティが動的に更新され、その後のエクスポートで新しいホスト名を使用するように指示できるようになりました。したがって、新しいホスト名の値は、このプロパティが更新された後にエクスポートされるオブジェクトのスタブに格納されます。

プリミティブ Class オブジェクトの直列化
以前のリリースでは、RMI 呼び出し内のプリミティブ Class オブジェクトを渡そうとすると ClassNotFoundException がスローされました。現在は、プリミティブ型の Class オブジェクトを含むオブジェクトをリモートメソッドのパラメータまたは戻り値として渡し、java.rmi.MarshalledObject インスタンスに保存することができます。

RMI 実装ログの拡張
Sun による J2SE 1.4 の RMI 実装では、新しいロギング API を使用して、実装固有のログを出力することができます。詳細については、「RMI 実装ログ」を参照してください。

直列化の拡張機能
J2SE 1.4 におけるオブジェクト直列化の拡張および改善の詳細は、「直列化リリースノート」を参照してください。
以前のリリースでの RMI 拡張機能
java.rmi.activation.ActivationGroupDesc (1.3 以降)
グループのクラス名を返す getClassName メソッドが、システムのデフォルトグループ実装を示す null を返すことが可能になりました。これまでは、記述子の構築時にデフォルトのグループ実装が選択された場合、getClassName メソッドは内部の実装クラスの名前を返していました。

この変更のために、JVM 1.3 で稼動するアプリケーションが新たな起動可能オブジェクトを ActivationSystem に登録する場合、rmid も 1.3 を実行できるようにアップグレードする必要があります。これは、1.3 以前の rmid では新たに登録された起動可能オブジェクトを起動できないためです。

起動可能オブジェクトのコンストラクタ (1.3 以降)
起動可能オブジェクトの「起動」コンストラクタ (ActivationIDMarshalledObject を引数にとる) は、オブジェクトが起動されるたびに ActivationInstantiator により呼び出されます。この「起動」コンストラクタを、private または protected にできるようになりました。以前は、実装が許可していたのは、public な起動コンストラクタだけでした。

リモートオブジェクトの直列化 (1.2.2 以降)
1.2.2 より前は、アンエクスポートされたリモートオブジェクトを RMI 呼び出しに渡そうとすると、java.rmi.StubNotFoundException が返されました。RMI ランタイムでリモートオブジェクト実装を対応するスタブに置換しているときに、スタブオブジェクトの検索に失敗するとこの例外が発生していました。1.2.2 以降のリリースでは、アンエクスポートされたリモートオブジェクトを RMI 呼び出しに渡しても、例外は発生しません。スタブの代わりに、このリモートオブジェクトが直列化されます。リモートオブジェクト実装が直列化可能でない場合は、アンエクスポートされたオブジェクトを RMI 呼び出しに渡そうとすると、java.rmi.RemoteException および入れ子にされた例外 java.io.NotSerializableException が返されます。

java.rmi.server.RMIClassLoader (1.3 以降)
java.rmi.server.RMIClassLoader に、新しいメソッド getClassLoader が追加されました。このメソッドは、特定のコードベースの URL パスからクラスをロードするときに RMI によって使われるクラスローダを返します。この API は、RMI の整列化および非整列化の動作がすべて必要な実装で使うことができます。詳細は、 java.rmi.server.RMIClassLoader を参照してください。
RMI ツールの変更 (1.3 以降)
RMI スタブコンパイラ rmic
  • rmic では、スタブのデフォルトの生成先ディレクトリが、パッケージ名の付いた、現在の作業ディレクトリのサブディレクトリになりました。「-d」オプションを指定しない場合は、現在の作業ディレクトリ「.」が引数として指定されていると見なされます。デフォルトの生成先ディレクトリをオーバーライドしても、「-d」が使われます。
  • IDL および IIOP のスタブを生成するために、「-idl」「-iiop」オプションが追加されました。
RMI 起動デーモン rmid
デフォルトでは、rmid は現在、セキュリティポリシーファイルを要求します。

* この Web サイトで使用されている用語「Java 仮想マシン」または「JVM」は、Java プラットフォーム用の仮想マシンを表します。


Copyright © 2001 Sun Microsystems, Inc. All Rights Reserved. 
コメントの送付先: rmi-comments@java.sun.com 
Sun