2017-06-02 4 views
3

Ich benutze Jersey-Client-3.0-SNAPSHOT.JerseyClient async Anrufe scheint hängende Themen zu verlassen

ich so etwas wie:

final Client client = createClient(); 

...

Builder builder = target.request(); 
    for (final Entry<String, String> entry : getHeaders().entrySet()) { 
     builder = builder.header(entry.getKey(), entry.getValue()); 
    } 
    final Builder finalBuilder = builder; 
    executor.submit(() -> { 
     final Entity<?> entity = createPostEntity(); 
     futureResponse = finalBuilder.async().post(entity); 
     try { 
      response = futureResponse.get(TIMEOUT_MILLIS, TimeUnit.MILLISECONDS); 
      consumeResponse(response); 
     } catch (ExecutionException | TimeoutException | InterruptedException | IOException e) { 
      errorConsumer.accept(e); 
     } 
    }); 

    if (futureResponse != null) { 
     try { 
      futureResponse.cancel(true); 
     } catch (final Exception e) { 
      //does nothing, now we try keep closing resources 
     } 
    } 
    if (response != null) { 
     try { 
      response.close(); 
     } catch (final Exception e) { 
      //does nothing, now we try keep closing resources 
     } 
    } 

... // für Antworten warten und lesen oder was auch immer

client.close(); 

Und ein neuer Thread hält Jedes Mal, wenn Sie einen dieser Clients erstellen und zerstören.

Gibt es eine sichere Möglichkeit, diese Threads zu zerstören? Ist das ein erwartetes Verhalten? Bin etwas falsch gemacht?

Antwort

2

In asynchronous Anrufe in Jersey client, wenn wir close() auf client Objekt aufrufen, zerstört es die thread in async Berufung verwendet. Also, es ist das erwartete Verhalten, dass wann immer client.close() Anweisung ausgeführt wird, wird es den Thread zerstören und das nächste Mal wird ein neuer Thread für nächste async Aufruf erstellt werden.

Nun, eine des sicheren Weges client Objekt und zugehörigen Thread unter Berücksichtigung Fehlerszenario zu schließen ist unten -

Client client = ClientBuilder.newClient(); 

    WebTarget webTarget = client.target(SERVER_URL).path(API_PATH); 

    Invocation.Builder invocationBuilder = webTarget.request(MediaType.APPLICATION_JSON); 
    // set headers and other stuff 

    AsyncInvoker asyncInvoker = invocationBuilder.async(); 

    asyncInvoker.get(new InvocationCallback<Response>() { 

     @Override 
     public void completed(Response response) { 
      if (response.getStatusInfo().equals(Status.OK)) { 
       // parse the response in success scenario 
      } else { 
       // parse the response if error response is received from server 
      } 
      client.close(); 
     } 

     @Override 
     public void failed(Throwable throwable) { 
      System.out.println("An error occurred while calling API"); 
      throwable.printStackTrace(); 
      client.close(); 
     } 
    }); 
Verwandte Themen