Asynchrone Verarbeitung
Sie können das Verfahren der asynchronen Verarbeitung in JAX-RS 2.0 verwenden, um Threads zu verarbeiten. Die asynchrone Verarbeitung wird sowohl in der Client-API als auch in den Server-APIs unterstützt. Weitere Informationen zur asynchronen Verarbeitung in den Client- und Server-APIs finden Sie in Kapitel 8 der Spezifikation JSR 339: JAX-RS 2.0: The Java API for RESTful Web Services.
Die folgenden zwei Beispiele zeigen die asynchrone Verarbeitung in den Client- und Server-APIs:
- Asynchrone Verarbeitung in der Client-API:
Client client = ClientBuilder.newClient(); WebTarget target = client.target("http://example.org/customers/{id}"); target.resolveTemplate("id", 123).request().async().get( new InvocationCallbackCustomer() { @Override public void completed(Customer customer) { // Verarbeitung } @Override public void failed(Throwable throwable) { // Prozessfehler } });
- Asynchrone Verarbeitung in der Server-API:
@Path("/async") public class MyResource { @GET public void getAsync(@Suspended final AsyncResponse asyncResponse){ CompletionCallback callBack = new CompletionCallback(){ @Override public void onComplete(Throwable throwable) { ... } }; asyncResponse.register(callBack); asyncResponse.resume("some Response"); } }
Die JAX-RS-2.0-Implementierung in WebSphere Application Server Traditional unterstützt EJBs und die Verwendung von Stateless und Singleton-Session-Beans als Stammressourcenklassen. Wenn eine
EJB-Methode mit @Asynchronous annotiert ist, ordnet der EJB-Container automatisch die erforderlichen Ressourcen für die Ausführung zu. In diesem Beispiel ist daher die Verwendung eines Steuerprogramms für das Generieren einer asynchronen Antwort nicht erforderlich.
Beispiel:
@Stateless
@Path("/")
class EJBResource {
@GET @Asynchronous
public void longRunningOp(@Suspended AsyncResponse ar) {
executeLongRunningOp();
ar.resume("Hello async world!");
}
}
Explizites Thread-Management ist hier nicht erforderlich, da alles vom EJB-Container gesteuert wird. Die Antwort wird durch die Aufrufwiederaufnahme der injizierten AsyncResponse produziert. Somit ist der Rückgabetyp von longRunningOp "void".