RMI:线程在等待服务器端
问题描述:
我有以下代码:RMI:线程在等待服务器端
public interface RmiServer extends Remote{
public String getMessage()throws RemoteException;
}
public class DefaultRmiServer implements RmiServer{
private LinkedBlockingQueue<String> queue;
@Override
public String getMessage()throws RemoteException{
return queue.take();
}
...
}
当RMI客户端调用getMessage()
方法显然可以有两种情况:
- 存在的消息队列和方法返回
- 有
no
消息队列和线程正在等待
这次rmi呼叫的第二种情况会发生什么?客户等待多久?
答
Sun RMI客户端连接的timout正在由属性sun.rmi.transport.tcp.responseTimeout
控制,该属性默认设置为无超时(=永远等待)。
sun.rmi.transport.tcp.responseTimeout(1.4和更新版本):
的 值这个属性表示的时间长度(以毫秒为单位),所述 客户端的Java RMI运行时将读取远程 方法调用的响应数据时,在建立的JRMP连接上使用套接字读取超时。因此,可以使用此属性在等待远程调用的结果时强制执行 超时;如果此 超时过期,则关联的调用将失败,并返回 java.rmi.RemoteException。但是,设置此属性时应该考虑 ,因为它实际上会将上限 绑定在任何成功的传出远程调用的允许持续时间上。最大值为Integer.MAX_VALUE,值为 零表示无限超时。默认值为零(没有 超时)。
对于这一点,可用于控制RMI连接参见sun.rmi Properties
默认情况下,永远其它参数列表。 – GhostCat
如果你想让这个更健壮的api,我会建议实现一个方法,它需要一个“long waitTime”,它允许客户端控制他们愿意等待多长时间(而不是依赖rmi超时这是一个“全球“值为jvm)。 – jtahlborn