Asynchronous JAX-RS: Timeout Configuration and Handling 📎
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.TimeUnit;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.container.AsyncResponse;
import javax.ws.rs.container.Suspended;
import javax.ws.rs.core.Response;
@Path("ping")
public class PingResource {
@GET
public void ping(@Suspended AsyncResponse response) {
response.setTimeout(1, TimeUnit.SECONDS);
response.setTimeoutHandler(this::onTimeout);
//managed thread pools omitted
CompletableFuture.supplyAsync(this::heavyThinking).thenAccept(response::resume);
}
String heavyThinking() {
try {
Thread.sleep(1000 * 2);
} catch (InterruptedException e) {}
return "42";
}
public void onTimeout(AsyncResponse response) {
response.resume(Response.status(204).header("info", "late, but o.k").build());
}
}
CLI:
curl -i http://localhost:8080/jaxrs-async-timeout/resources/ping
yields:
HTTP/1.1 204 No Content
Server: Payara Server 5.191 #badassfish
info: late, but o.k
Project created with javaee8-essentials-archetype, the 4kB ThinWAR was built and deployed with: wad.sh in 2.4s
See you at Web, MicroProfile and Java EE Workshops at Munich Airport, Terminal 2 or Virtual Dedicated Workshops / consulting. Is Munich's airport too far? Learn from home: airhacks.io.