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.
InformationsquelleAutor Sumitk | 2015-04-27
Schreibe einen Kommentar