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 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 ("Spezifikation").

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) { 
                  // Do something 
               }       
              @Override 
               public void failed(Throwable throwable) {
                  // Process error 
               } 
    }); 
    
  • 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 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".