RMI リリースノート |
ドキュメントの目次 |
J2SETM 1.4 の RMI の拡張機能
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
によって失敗することがあります。この場合は、失敗したリモート呼び出しの再試行が続きます。この問題は、次回の保守リリースで修正される予定です。
以前のリリースでの RMI 拡張機能
- サーバ側スタックトレースがリモートの例外に保持される
- RMI ランタイム実装が、以前のリリースで行っていたようにクライアント側スタックトレースを記入するだけでなく、リモート呼び出しからスローされる例外のサーバ側スタックトレース情報を保持するようになりました。したがって、そのような例外がクライアントコードにアクセス可能になると、そのスタックトレースには、元のサーバ側トレースデータと、それに続くクライアント側トレースのすべてが含まれることになります。
この機能は、J2SE 1.4 の java.lang.Throwable の新しい「スタックトレース情報へのプログラムによるアクセス」機能によって可能になりました。これには、デフォルトの直列化形式の Throwable のスタックトレースデータ部分の作成が含まれます。クライアント側 RMI ランタイム実装は、この機能と連携するために、以前のリリースのように、単にクライアント側トレースで上書きするのではなく、クライアント側トレースを、非整列化されたサーバ側トレースに追加します。
パフォーマンスまたは機密性に関する理由により、RMI サーバアプリケーションによっては、リモート呼び出しの結果 (J2SE 1.4 の例外のデフォルトの直列化形式の一部として)、整列化される例外に、サーバ側スタックトレースデータが付随することを防ぐ必要がある場合があります。そのような場合は、実装に固有のシステムプロパティである
を「true」に設定すると、サーバ側 RMI ランタイム実装によって、リモートメソッドの呼び出しの結果、現在の仮想マシンからスローされたすべての例外のスタックトレースが消去されます。sun.rmi.server.suppressStackTraces
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 ツールの変更 (1.3 以降)
java.rmi.activation.ActivationGroupDesc
(1.3 以降)- グループのクラス名を返す
getClassName
メソッドが、システムのデフォルトグループ実装を示すnull
を返すことが可能になりました。これまでは、記述子の構築時にデフォルトのグループ実装が選択された場合、getClassName
メソッドは内部の実装クラスの名前を返していました。この変更のために、JVM 1.3 で稼動するアプリケーションが新たな起動可能オブジェクトを
ActivationSystem
に登録する場合、rmid
も 1.3 を実行できるようにアップグレードする必要があります。これは、1.3 以前のrmid
では新たに登録された起動可能オブジェクトを起動できないためです。
- 起動可能オブジェクトのコンストラクタ (1.3 以降)
- 起動可能オブジェクトの「起動」コンストラクタ (
ActivationID
とMarshalledObject
を引数にとる) は、オブジェクトが起動されるたびに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 スタブコンパイラ
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 |