2011-11-11 5 views
0

数秒以内に終了または失敗する必要があるRMIコールがあります。呼び出し中に使用されているSocket(接続と読み取りタイムアウトを含む)を変更できますが、Naming.lookup呼び出しは独自のパラメータを使用しているようです。単一のスレッドに対してのみsun.rmi.transport.tcp.handshakeTimeoutを設定しますか?

縮小すると、問題は解決しますが、私は実際にはVM全体に影響を与えない方法でやりたいと思います。プロパティをスレッドローカルとして設定できますか?

財産及びその他のRMIのプロパティがhttp://download.oracle.com/javase/1.4.2/docs/guide/rmi/sunrmiproperties.html

+0

ハンドシェークタイムアウトのでそれは問題を解決することはできません設定、etire呼び出し、唯一の初期プロトコル交換をカバーしていません'文書化されていない応答タイムアウトプロパティがありますが、スレッドごとに設定することはできません。 Naming.lookup()はこの点で特別なことはしません。 – EJP

答えて

0

オーケーで文書化されて、私はこれを達成する醜い方法を見つけました。 lookupは、あなたが渡すことができるRMIClientSocketFactorySocketを使用して実行されます。工場出荷時には、コンフィギュレーションにSocketが返されます。

残念なことに、クラスがRMIで使用されているクラスの一部を上書きするため、handshakeTimeoutの値を持つSocket.setSoTimeout(..)を呼び出すなど、多くのことができません。

はしかし、何もsoTimeout chaning許さないSocketのサブクラスを返すために、工場の変更からあなたを停止されていない(すなわち。何もしないようにsetSoTimeoutを上書きすることによって)。 TCPChannelクラスの利用可能なソースを持つ

は非常に有用であることが判明:http://www.java2s.com/Open-Source/Java-Document/6.0-JDK-Modules-sun/rmi/sun/rmi/transport/tcp/TCPChannel.java.htm

関連する問題