2017-02-19 2 views
1

In Jaxrs (WebClient zum Beispiel) können wir einen Verbindungs-Timeout und einen Lese-Timeout setzen.Jaxrs Fähigkeit, ein globales Timeout zu setzen (connect + read)

ClientConfiguration c = WebClient.getConfig(client); 
    HTTPConduit http = c.getHttpConduit(); 
    HTTPClientPolicy httpClientPolicy = new HTTPClientPolicy(); 
    httpClientPolicy.setConnectionTimeout(timeout); 
    httpClientPolicy.setReceiveTimeout(timeout); 
    httpClientPolicy.setAllowChunking(false); 
    http.setClient(httpClientPolicy); 

Ich möchte ein Timeout setzen, die beide enthält, ich weiß nicht wirklich, wie viel Zeit bei der Verbindung oder bei der Aufnahme ausgegeben wird, ist meine Anforderung eine Antwort in X Sekunden zu erhalten oder einfach nur die Suche verwerfen .

Antwort

1

Es gibt keine Möglichkeit, mit CXF eine maximale Zeitüberschreitung für eine Anforderung festzulegen, die sowohl Verbindungs- als auch Empfangsdauer berücksichtigt. Die maximale Timeout für eine Anforderung wird:

maximum_timeout = connection_timeout + receive_timeout 

Sehen Sie diese ähnliche Frage für Apache HTTP client. Die Problemumgehung könnte sein, einen Timer in einem separaten Thread zu setzen, um die Verbindung abzubrechen, wenn die gewünschte maximale Zeit abgelaufen ist.

+0

Vielleicht über einen Interceptor ?, aber ich weiß nicht, ob es machbar ist – cocorossello

+1

Ich habe 'WebClient' javadoc und es überprüft Es ist nicht möglich, eine aktuelle Anforderung abzubrechen, daher ist es nicht möglich, einen Interceptor zu verwenden, da dieser im selben Thread ausgeführt wird wie die Hauptanforderung (und der Hauptthread wird bis zur Antwort/Zeitüberschreitung blockiert). Sie müssen einen zusätzlichen Überwachungs-Thread mit einem Timeout erstellen und in beiden Fällen asynchron arbeiten: Timeout oder korrekte Antwort. Überlegen Sie, ob es sich lohnt ... – pedrofb

Verwandte Themen