Установить sun.rmi.transport.tcp.handshakeTimeout только для одного потока? - PullRequest
0 голосов
/ 11 ноября 2011

У нас есть вызов RMI, который должен завершиться или потерпеть неудачу в течение пары секунд.Вы можете изменить Socket, используемый во время самого вызова (включая тайм-ауты подключения и чтения), но вызов Naming.lookup, похоже, использует свои собственные параметры.

Уменьшение sun.rmi.transport.tcp.handshakeTimeout устраняет проблему, но яочень бы хотел сделать это так, чтобы это не влияло на всю ВМ.Можно ли установить свойство как локальный поток?

Свойство и другие свойства RMI задокументированы в http://download.oracle.com/javase/1.4.2/docs/guide/rmi/sunrmiproperties.html

1 Ответ

0 голосов
/ 11 ноября 2011

Хорошо, я нашел уродливый способ сделать это. lookup выполняется с использованием Socket из RMIClientSocketFactory, которое вы можете передать. Фабрика возвращает Socket с вашей конфигурацией.

К сожалению, это не очень хорошо для вас, так как класс TCPChannel, используемый в RMI, перезаписывает некоторые ваши настройки, включая вызов Socket.setSoTimeout(..) со значением handshakeTimeout.

Однако ничто не мешает вам изменить фабрику для возврата подкласса Socket, который не позволяет изменять soTimeout (т. Е. Путем перезаписи setSoTimeout ничего не делать).

Наличие источника, доступного для класса TCPChannel, оказалось очень полезным: http://www.java2s.com/Open-Source/Java-Document/6.0-JDK-Modules-sun/rmi/sun/rmi/transport/tcp/TCPChannel.java.htm

...