Asynchrone Verarbeitung
Sie können das asynchrone Verarbeitungsverfahren in JAX-RS 2.0 verwenden, um Threads zu verarbeiten. Die asynchrone Verarbeitung wird sowohl von der Client-API als auch von der Server-API unterstützt. Weitere Informationen zur asynchronen Verarbeitung in Client- und Server-APIs finden Sie in Kapitel 8 von JSR 339: JAX-RS 2.0: The Java API for RESTful Web Services (der "Spezifikation").
Die folgenden beiden 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) { // Aktionen ausführen... } @Override public void failed(Throwable throwable) { // Fehler verarbeiten } });
- 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 Liberty unterstützt EJB und die Verwendung von statusunabhängigen und Singleton-Session-Beans als Stammressourcenklassen. Wenn eine EJB-Methode mit der Annotation @Asynchronous versehen ist, ordnet
der EJB-Container automatisch die erforderlichen Ressourcen für die Ausführung der Methode zu. In diesem Szenario ist es somit nicht
notwendig, ein Steuerprogramm zum Generieren einer asynchronen Antwort zu verwenden. Beispiel:
@Stateless
@Path("/")
class EJBResource {
@GET @Asynchronous
public void longRunningOp(@Suspended AsyncResponse ar) {
executeLongRunningOp();
ar.resume("Hello async world!");
}
}
Ein explizites Thread-Management ist in diesem Fall nicht nötig, weil es vom EJB-Container gesteuert wird. Die Antwort wird erzeugt, indem für die
injizierte AsyncResponse "resume" aufgerufen wird. Der Rückgabetyp von longRunningOp ist daher "void".