2016-05-15 15 views
1

Ich habe einen Jersey-Client und möchte versuchen, versuchen erneut auf SocketTimeoutException, die der Fehler ist, den ich auf dem Serverprotokoll sehe. Das Code-Skelett ist unten. webtarget ist eine javax.ws.rs.client.WebTarget Instanz, deren URL-Pfad und Abfrageparameter bereits definiert sind. Das Problem, mit dem ich konfrontiert bin, ist, dass webtarget.request.get() niemals eine SocketTimeoutException auslöst, so dass ich diese Ausnahme nicht wirklich abfangen kann. Irgendwelche Gedanken, wie ich den Versuch tatsächlich durchführen kann?Java-Jersey-Wiederholungsanfrage auf SocketTimeoutException

int i = 0; 
Response response; 
while (true) { 
    try { 
     response = webtarget.request().get(); 
     break; 
    } catch (SocketTimeoutException e){ 
     if (i < retryNumber) { 
      i++; 
     } else { 
      // throws some exception 
     } 
    } 
} 
+0

nicht möchten Sie das Client-Timeout für eine Anforderung erhöhen, um die Socket-Timeout-Ausnahme an erster Stelle zu vermeiden. –

Antwort

2

Ich fand schließlich die Lösung. Es stellt sich heraus, SocketTimeoutException ist in eine ProcessingException abgebildet, die tatsächlich von der Jersey-Client geworfen wird. So funktionierte der folgende Code

int i = 0; 
Response response; 
while (true) { 
    try { 
     response = webtarget.request().get(); 
     break; 
    } catch (ProcessingException e){ 
     if (e.getCause() instanceof SocketTimeoutException && i < retryNumber) { 
      i++; 
     } else { 
      // throws some exception 
     } 
    } 
} 
0

Das ergibt keinen Sinn. Der Server löst SocketTimeoutException aus, fängt ihn ab, protokolliert ihn und gibt einen HTTP-Fehlercode an den Client zurück. Es kann keine Ausnahme für den Client auslösen.

Sie müssen beobachten, welche HTTP-Fehlercode zurückgegeben wird, und versuchen Sie es erneut unter dieser Bedingung.

+0

Warum gehen Sie davon aus, dass die Ausnahme nur auf dem Server ausgelöst werden kann? –