Я создал простой клиент Джерси, и он может успешно выполнить запрос 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");
}
Вы можете использовать javax.ws.rs.client вместо этого? Я считаю, что Invocation.Builder.async() будет делать то, что вы хотите: http://docs.oracle.com/javaee/7/api/javax/ws/rs/client/Invocation.Builder.html#async%28%29 –
Да, я думаю, что могу использовать javax.ws.rs.client, но поскольку у меня уже есть клиент-клиент из Джерси, я подумал, что проще просто использовать методы асинхронной работы вместо изменения всего класса. – Sumitk