Jersey-client-async-POST-Anforderung nicht warten auf Antwort
Habe ich eine einfache Jersey-client und ist in der Lage, erfolgreich zu tun, eine POST-Anfrage mit einer Nutzlast. Aber jetzt wartet er auf eine Antwort aus den http-Endpunkt:
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: Ist es möglich, den code nicht auf die Reaktion warten.
Ich versuche zu Lesen, die Jersey-client-docs zu finden, wenn möglich, seine für meinen code nicht auf die Reaktion warten? Ich sah, daß können wir nur schließen Sie die Verbindung, sobald wir die Antwort Lesen, aber es ist nicht hilfreich in meinem Fall. Ich möchte, um die Verbindung zu schließen, sobald ich nach der Nutzlast auf den Endpunkt.
Nur muss ich Feuer-und-vergessen Sie die POST-Anforderung, wie ich kümmern sich nicht über die Antwort. Dies ist, weil die Verarbeitung braucht viel Zeit, an diesem Endpunkt und ich möchte nicht den thread zu warten, für die Verarbeitung.
Außerdem ist es möglich, die Antwort zu warten für einige der Anforderungen, aber nicht für alle? Gibt es einen parameter, den ich einstellen kann in den client-das macht es zu warten/nicht warten? Ich bin immer noch am Lesen die java-docs, so könnte dies eine sehr einfache Einstellung, aber ich war nicht in der Lage zu finden, bis jetzt so gefragt hier. Danke!
[Update]
Ich es geschafft habe mit dem folgenden code aber wenn ich mein java-Beispiel-code druckt er start & fertig sofort, aber das Programm läuft eine Weile und wird dann beendet. Ich nehme an, Ihr wartet auf die Zukunft Antwort, so ist es möglich, dass ich mein Skript nicht warten? Der code ist:
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");
}
- Können Sie verwenden, javax.ws.rs.client statt? Ich glaube, Anrufung.Builder.async() würde das tun, was Sie wollen: docs.oracle.com/javaee/7/api/javax/ws/rs/client/...
- Ja, ich denke, dass ich verwenden können, javax.ws.rs.client, aber da ich schon die Jersey-client läuft, ich dachte, es wäre einfacher, benutzen Sie einfach die async-Methoden, anstatt zu ändern die ganze Klasse.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Habe ich eine TypeListener, um es wirklich asynchron. Die onComplete-Methode aufgerufen werden würde, wenn die Antwort empfangen wird.
Meine Antwort ist ein bisschen spät, aber ich scheine zu haben eine Lösung für Ihre Probleme. Ich hoffe, es kann jemand helfen in der Zukunft.
Ich bin halten Sie es kurz und geben Referenzen Fragen schon gefragt auf dieser Plattform
Für erste problem, wo Sie nicht wollen, zu warten. Sie können eine timeout-Eigenschaft zur Verfügung gestellt, die von jersey in seiner client-Objekt. Unten ist ein link, der behebt dieses problem.
Wie die Verbindung und read timeout mit Trikot 2.x?
Für das zweite problem, wo man sehen kann, dass es aufhört, nur nach der Ausführung für irgendwann ist, weil der client-thread weiter läuft, bis es mal aus. Hier finden Sie einen link mit besserer Beschreibung
JerseyClient asynchrone Aufrufe zu verlassen scheint hängenden Fäden