RMI:线程在等待服务器端

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()方法显然可以有两种情况:

  1. 存在的消息队列和方法返回
  2. no消息队列和线程正在等待

这次rmi呼叫的第二种情况会发生什么?客户等待多久?

+1

默认情况下,永远其它参数列表。 – GhostCat

+1

如果你想让这个更健壮的api,我会建议实现一个方法,它需要一个“long waitTime”,它允许客户端控制他们愿意等待多长时间(而不是依赖rmi超时这是一个“全球“值为jvm)。 – jtahlborn

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