2016-07-25 149 views
1

我有以下代碼: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

回答

4

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