2015-04-27 3 views
1

Я создал простой клиент Джерси, и он может успешно выполнить запрос POST с полезной нагрузкой. Но сейчас он ждет ответа от HTTP конечной точки:Джерси клиент async Запрос POST, чтобы не ждать ответа

public void callEndpoint(String endpoint, String payload) { 

    try { 
     ClientConfig config = new DefaultClientConfig(); 
     Client client = Client.create(config); 
     WebResource webResource = client.resource(getBaseURI(endpoint)); 

     log.debug("Sending payload [" + payload + "] to URL - [" + getBaseURI(endpoint) + "]"); 

     // POST method - Is this blocking? 
     // Is it possible to not wait for response here 
     ClientResponse response = webResource.accept("application/json") 
              .type("application/json") 
              .post(ClientResponse.class, payload); 
     if (response.getStatus() != 200) { 
      log.error("The endpoint [" + getBaseURI(endpoint) + "] returned a non 200 status code [" + response.getStatus() + "] "); 
     } 

    } catch (Exception e) { 
     log.error("The endpoint for " + endpoint + " - " + getBaseURI(endpoint) + " is not reachable. This is the exception - " + e); 
    } 

} 

private URI getBaseURI(String endpoint) { 
    // Get this URI from config 
    String URL = "http://www.somewhere.com/v2/" + endpoint; 
    return UriBuilder.fromUri(URL).build(); 
} 

Ques: Возможно ли код не ждать ответа.

Я пытался прочитать Jersey client docs, чтобы узнать, может ли мой код не дождаться ответа? Я видел, что мы можем закрыть соединение только после того, как прочитаем ответ, но это не полезно в моем случае. Я хочу закрыть соединение, как только я отправлю полезную нагрузку в конечную точку.

Мне просто нужно стрелять и забыть запрос POST, поскольку меня не волнует ответ. Это связано с тем, что обработка занимает много времени в этой конечной точке, и я не хочу, чтобы поток ожидал обработки.

Также можно дождаться ответа на некоторые из запросов, но не для всех? Есть ли параметр, который я могу установить в клиенте, который заставит его ждать/не ждать? Я все еще читаю java-документы, поэтому это может быть очень простая настройка, но я не смог найти до сих пор, поэтому прошу здесь. Благодаря!

[Update]

Я получил это работает со следующим кодом, но когда я запускаю мой пример кода Java печатает старт & сделано сразу, но программа продолжает работать на некоторое время, а затем завершает свою работу. Я предполагаю, что его ждет ответ «Будущее», так что возможно ли, что мой сценарий не дождался его? Код:

public static void callEndpoint(String endpoint, String payload) { 

    try { 
     ClientConfig config = new DefaultClientConfig(); 
     Client client = Client.create(config); 
     AsyncWebResource webResource = client.asyncResource(getBaseURI(endpoint)); 

     // POST method 
     System.out.println("start"); 
     Future<ClientResponse> resp = webResource.accept("application/json") 
       .type("application/json") 
       .post(ClientResponse.class, payload); 
     // This line makes the code wait for output 
     //System.out.println(resp.get()); 

    } catch (Exception e) { 

     System.out.println ("The endpoint for " + endpoint + " - " + getBaseURI(endpoint) + " is not reachable. This is the exception - " + e); 
    } 
    System.out.println("done"); 
} 
+0

Вы можете использовать javax.ws.rs.client вместо этого? Я считаю, что Invocation.Builder.async() будет делать то, что вы хотите: http://docs.oracle.com/javaee/7/api/javax/ws/rs/client/Invocation.Builder.html#async%28%29 –

+0

Да, я думаю, что могу использовать javax.ws.rs.client, но поскольку у меня уже есть клиент-клиент из Джерси, я подумал, что проще просто использовать методы асинхронной работы вместо изменения всего класса. – Sumitk

ответ

1

Я использовал TypeListener, чтобы сделать его действительно асинхронным. Метод onComplete будет вызываться, когда будет получен ответ.

webResource.post(new TypeListener<ClientResponse>(ClientResponse.class) { 
      @Override 
      public void onComplete(Future<ClientResponse> f) throws InterruptedException { 
       try { 
        ClientResponse response = f.get(); 
        if (response == null || response.getClientResponseStatus() != Status.OK) { 
         System.err.println(" Async " + response.getClientResponseStatus()+" "+response.getStatus()); 
        } else{ 
         System.out.println(" Async " + response.getClientResponseStatus()+" "+response.getStatus()+" "+response.getEntity(String.class)); 
        } 
       } catch (ExecutionException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
      } 
     });