我们有一个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 :(得分: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