2016-07-25 29 views
1

Ich habe den folgenden Code:RMI: auf Server-Seite Thread wartet

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(); 
    } 
    ... 
} 

Wenn rmi Client ruft getMessage() Methode klar ist, dass es zwei Situationen sein können:

  1. gibt es eine Nachricht in Warteschlange und Methode liefert
  2. es no Nachricht in der Warteschlange und Faden wird
wartet

Was passiert im zweiten Fall mit diesem Rmi-Aufruf? Wie lange wird der Client warten?

+1

standardmäßig sehen steuern können. – GhostCat

+1

Wenn Sie dies zu einer robusteren API machen wollen, würde ich vorschlagen, eine Methode zu implementieren, die eine "lange Wartezeit" benötigt, die es dem Client erlaubt, zu kontrollieren, wie lange er wartet (anstatt sich auf das rmi-Timeout zu verlassen). globaler "Wert für den jvm). – jtahlborn

Antwort

4

Die Zeitüberschreitung der Sun RMI-Clientverbindung wird durch die Eigenschaft sun.rmi.transport.tcp.responseTimeout gesteuert, die standardmäßig auf no timeout gesetzt ist (= wartet auf immer).

sun.rmi.transport.tcp.responseTimeout (1.4 und neuer):

Der Wert von diese Eigenschaft die Länge der Zeit darstellt (in Millisekunden), dass die clientseitigen Java RMI Laufzeit verwendet als Socket-Lese-Timeout auf einer eingerichteten JRMP-Verbindung beim Lesen von Antwortdaten für einen Remote-Methodenaufruf . Daher kann diese Eigenschaft verwendet werden, um ein Timeout von beim Warten auf die Ergebnisse von Remoteaufrufen zu erzwingen; Wenn das Zeitlimit abläuft, schlägt der zugehörige Aufruf mit einer java.rmi.RemoteException fehl. Das Setzen dieser Eigenschaft sollte jedoch mit der Berücksichtigung gebührend berücksichtigt werden, da es effektiv einen oberen gebunden an die zulässige Dauer eines erfolgreichen abgehenden Remote-Aufrufs platziert. Der Maximalwert ist Integer.MAX_VALUE, und ein Wert von Null gibt ein unbegrenztes Timeout an. Der Standardwert ist Null (kein Timeout).

Für die Liste dieser und anderer Parameter, die RMI-Verbindungen sun.rmi Properties, für immer