Java RMI:正在服务器端等待的线程

Java RMI:正在服务器端等待的线程,java,multithreading,rmi,Java,Multithreading,Rmi,我有以下代码: public interface RmiServer extends Remote{ public String getMessage()throws RemoteException; } public class DefaultRmiServer implements RmiServer{ private LinkedBlockingQueue<String> queue; @Override public String getMessage(

我有以下代码:

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();
  }
  ...
}
公共接口RmiServer扩展远程{
公共字符串getMessage()引发RemoteException;
}
公共类DefaultRmiServer实现RmiServer{
专用LinkedBlockingQueue队列;
@凌驾
公共字符串getMessage()引发RemoteException{
返回队列。take();
}
...
}
当rmi客户端调用
getMessage()
方法时,很明显,可能有两种情况:

  • 队列中有一条消息,方法返回
  • 队列中没有
    消息,线程正在等待

  • 第二种情况下,rmi呼叫会发生什么?客户端将等待多长时间?

    Sun RMI客户端连接的超时由属性
    Sun.RMI.transport.tcp.responseTimeout控制,该属性默认设置为无超时(=永远等待)

    sun.rmi.transport.tcp.responseTimeout(1.4及更高版本):

    价值 此属性表示事件发生的时间长度(以毫秒为单位) 客户端Java RMI运行时将用作服务器上的套接字读取超时 读取远程服务器的响应数据时已建立JRMP连接 方法调用。因此,此属性可用于强制 等待远程调用结果时超时;如果这 超时过期时,关联的调用将失败,并出现错误 java.rmi.RemoteException。设置此属性时应使用 然而,由于它有效地设置了一个上限 绑定到任何成功传出远程服务器的允许持续时间 调用。最大值为Integer.MAX_值,值为 零表示无限超时。默认值为零(否) 超时)


    有关可用于控制RMI连接的此参数和其他参数的列表,请参阅Sun RMI客户端连接的超时由属性
    Sun.RMI.transport.tcp.responseTimeout控制,该属性默认设置为无超时(=永远等待)

    sun.rmi.transport.tcp.responseTimeout(1.4及更高版本):

    价值 此属性表示事件发生的时间长度(以毫秒为单位) 客户端Java RMI运行时将用作服务器上的套接字读取超时 读取远程服务器的响应数据时已建立JRMP连接 方法调用。因此,此属性可用于强制 等待远程调用结果时超时;如果这 超时过期时,关联的调用将失败,并出现错误 java.rmi.RemoteException。设置此属性时应使用 然而,由于它有效地设置了一个上限 绑定到任何成功传出远程服务器的允许持续时间 调用。最大值为Integer.MAX_值,值为 零表示无限超时。默认值为零(否) 超时)


    有关可用于控制RMI连接的此参数和其他参数的列表,请参见默认情况下的“永远”。如果您希望使此api更为健壮,我建议实现一种方法,该方法需要“长等待时间”,允许客户端控制他们愿意等待的时间(而不是依赖RMI超时,它是默认情况下是永久的。如果您想让它成为一个更健壮的api,我建议实现一个方法,它需要一个“长等待时间”,允许客户端控制他们愿意等待的时间(而不是依赖rmi超时,它是jvm的一个“全局”值)。