仅为单个线程设置sun.rmi.transport.tcp.handshakeTimeout?

时间:2011-11-11 15:58:15

标签: java spring rmi

我们有一个RMI调用,需要在几秒钟内完成或失败。您可以修改呼叫期间使用的Socket(包括连接和读取超时),但Naming.lookup呼叫似乎使用自己的参数。

减少sun.rmi.transport.tcp.handshakeTimeout可以解决问题,但我真的很想以不影响整个VM的方式来解决问题。您可以将该属性设置为本地线程吗?

属性和其他RMI属性记录在http://download.oracle.com/javase/1.4.2/docs/guide/rmi/sunrmiproperties.html

1 个答案:

答案 0 :(得分:0)

好的,我发现了一种难以实现的方法。 lookup是使用您可以传递的Socket中的RMIClientSocketFactory执行的。工厂返回Socket您的配置。

不幸的是,由于RMI中使用的TCPChannel类会覆盖您的部分配置,包括使用值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