use of jakarta.ws.rs.container.CompletionCallback in project resteasy by resteasy.
the class AsyncRequestFilter method filter.
@Override
public void filter(ContainerRequestContext requestContext) throws IOException {
requestContext.getHeaders().add("RequestFilterCallback" + name, String.valueOf(callbackException));
callbackException = null;
SuspendableContainerRequestContext ctx = (SuspendableContainerRequestContext) requestContext;
String action = ctx.getHeaderString(name);
LOG.error("Filter request for " + name + " with action: " + action);
if ("sync-pass".equals(action)) {
// do nothing
} else if ("sync-fail".equals(action)) {
ctx.abortWith(Response.ok(name).build());
} else if ("async-pass".equals(action)) {
ctx.suspend();
ExecutorService executor = Executors.newSingleThreadExecutor();
executor.submit(() -> ctx.resume());
} else if ("async-pass-instant".equals(action)) {
ctx.suspend();
ctx.resume();
} else if ("async-fail".equals(action)) {
ctx.suspend();
ExecutorService executor = Executors.newSingleThreadExecutor();
executor.submit(() -> ctx.abortWith(Response.ok(name).build()));
} else if ("async-fail-instant".equals(action)) {
ctx.suspend();
ctx.abortWith(Response.ok(name).build());
} else if ("async-throw-late".equals(action)) {
ctx.suspend();
HttpRequest req = ResteasyContext.getContextData(HttpRequest.class);
ExecutorService executor = Executors.newSingleThreadExecutor();
executor.submit(() -> {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
LOG.error("Error:", e);
}
AsyncResponse resp = req.getAsyncContext().getAsyncResponse();
resp.register((CompletionCallback) (t) -> {
if (callbackException != null)
throw new RuntimeException("Callback called twice");
callbackException = Objects.toString(t);
});
if ("true".equals(req.getHttpHeaders().getHeaderString("UseExceptionMapper")))
ctx.resume(new AsyncFilterException("ouch"));
else
ctx.resume(new Throwable("ouch"));
});
}
LOG.error("Filter request for " + name + " with action: " + action + " done");
}
use of jakarta.ws.rs.container.CompletionCallback in project helidon by oracle.
the class HelloWorldResource method slowFailNoCounter.
@GET
@Path("/slowFailNoCounter")
@Produces(MediaType.TEXT_PLAIN)
public void slowFailNoCounter(@Suspended AsyncResponse ar) {
ar.register(new CompletionCallback() {
@Override
public void onComplete(Throwable throwable) {
if (throwable == null) {
System.out.println("OK");
} else {
System.out.println("No good");
}
}
});
executorService.execute(() -> {
try {
TimeUnit.MILLISECONDS.sleep(NOT_SO_SLOW_DELAY_MS);
} catch (InterruptedException e) {
// Don't care for testing.
}
ar.resume(new IllegalStateException("Fail on request"));
});
}
use of jakarta.ws.rs.container.CompletionCallback in project resteasy by resteasy.
the class AsyncResponseFilter method filter.
@Override
public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext) throws IOException {
// copy request filter callback values
for (Entry<String, List<String>> entry : requestContext.getHeaders().entrySet()) {
if (entry.getKey().startsWith("RequestFilterCallback"))
addValuesToContext(responseContext, entry);
}
responseContext.getHeaders().add("ResponseFilterCallback" + name, String.valueOf(callbackException));
callbackException = null;
SuspendableContainerResponseContext ctx = (SuspendableContainerResponseContext) responseContext;
String action = requestContext.getHeaderString(name);
LOG.error("Filter response for " + name + " with action: " + action);
if ("sync-pass".equals(action)) {
// do nothing
} else if ("sync-fail".equals(action)) {
ctx.setEntity(name);
} else if ("async-pass".equals(action)) {
ctx.suspend();
ExecutorService executor = Executors.newSingleThreadExecutor();
executor.submit(() -> ctx.resume());
} else if ("async-pass-instant".equals(action)) {
ctx.suspend();
ctx.resume();
} else if ("async-fail".equals(action)) {
ctx.suspend();
ExecutorService executor = Executors.newSingleThreadExecutor();
executor.submit(() -> {
ctx.setEntity(name);
ctx.resume();
});
} else if ("async-fail-late".equals(action)) {
ctx.suspend();
ExecutorService executor = Executors.newSingleThreadExecutor();
executor.submit(() -> {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
LOG.error("Error:", e);
}
ctx.setEntity(name);
ctx.resume();
});
} else if ("async-fail-instant".equals(action)) {
ctx.suspend();
ctx.setEntity(name);
ctx.resume();
} else if ("sync-throw".equals(action)) {
throw new AsyncFilterException("ouch");
} else if ("async-throw-late".equals(action)) {
ctx.suspend();
HttpRequest req = ResteasyContext.getContextData(HttpRequest.class);
ExecutorService executor = Executors.newSingleThreadExecutor();
executor.submit(() -> {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
LOG.error("Error:", e);
}
ctx.setEntity(name);
ResteasyAsynchronousResponse resp = req.getAsyncContext().getAsyncResponse();
resp.register((CompletionCallback) (t) -> {
if (callbackException != null)
throw new RuntimeException("Callback called twice");
callbackException = Objects.toString(t);
});
if ("true".equals(req.getHttpHeaders().getHeaderString("UseExceptionMapper")))
ctx.resume(new AsyncFilterException("ouch"));
else
ctx.resume(new Throwable("ouch"));
});
}
LOG.error("Filter response for " + name + " with action: " + action + " done");
}
use of jakarta.ws.rs.container.CompletionCallback in project resteasy by resteasy.
the class AsyncResponseFilter method filter.
@Override
public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext) throws IOException {
// copy request filter callback values
for (Entry<String, List<String>> entry : requestContext.getHeaders().entrySet()) {
if (entry.getKey().startsWith("RequestFilterCallback"))
addValuesToContext(responseContext, entry);
}
responseContext.getHeaders().add("ResponseFilterCallback" + name, String.valueOf(callbackException));
callbackException = null;
SuspendableContainerResponseContext ctx = (SuspendableContainerResponseContext) responseContext;
String action = requestContext.getHeaderString(name);
LOG.error("Filter response for " + name + " with action: " + action);
if ("sync-pass".equals(action)) {
// do nothing
} else if ("sync-fail".equals(action)) {
ctx.setEntity(name);
} else if ("async-pass".equals(action)) {
ctx.suspend();
ExecutorService executor = Executors.newSingleThreadExecutor();
executor.submit(() -> ctx.resume());
} else if ("async-pass-instant".equals(action)) {
ctx.suspend();
ctx.resume();
} else if ("async-fail".equals(action)) {
ctx.suspend();
ExecutorService executor = Executors.newSingleThreadExecutor();
executor.submit(() -> {
ctx.setEntity(name);
ctx.resume();
});
} else if ("async-fail-late".equals(action)) {
ctx.suspend();
ExecutorService executor = Executors.newSingleThreadExecutor();
executor.submit(() -> {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
LOG.error("Error:", e);
}
ctx.setEntity(name);
ctx.resume();
});
} else if ("async-fail-instant".equals(action)) {
ctx.suspend();
ctx.setEntity(name);
ctx.resume();
} else if ("sync-throw".equals(action)) {
throw new AsyncFilterException("ouch");
} else if ("async-throw-late".equals(action)) {
ctx.suspend();
HttpRequest req = ResteasyContext.getContextData(HttpRequest.class);
ExecutorService executor = Executors.newSingleThreadExecutor();
executor.submit(() -> {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
LOG.error("Error:", e);
}
ctx.setEntity(name);
ResteasyAsynchronousResponse resp = req.getAsyncContext().getAsyncResponse();
resp.register((CompletionCallback) (t) -> {
if (callbackException != null)
throw new RuntimeException("Callback called twice");
callbackException = Objects.toString(t);
});
if ("true".equals(req.getHttpHeaders().getHeaderString("UseExceptionMapper")))
ctx.resume(new AsyncFilterException("ouch"));
else
ctx.resume(new Throwable("ouch"));
});
}
LOG.error("Filter response for " + name + " with action: " + action + " done");
}
use of jakarta.ws.rs.container.CompletionCallback in project resteasy by resteasy.
the class AsyncRequestFilter method filter.
@Override
public void filter(ContainerRequestContext requestContext) throws IOException {
requestContext.getHeaders().add("RequestFilterCallback" + name, String.valueOf(callbackException));
callbackException = null;
SuspendableContainerRequestContext ctx = (SuspendableContainerRequestContext) requestContext;
String action = ctx.getHeaderString(name);
LOG.error("Filter request for " + name + " with action: " + action);
if ("sync-pass".equals(action)) {
// do nothing
} else if ("sync-fail".equals(action)) {
ctx.abortWith(Response.ok(name).build());
} else if ("async-pass".equals(action)) {
ctx.suspend();
ExecutorService executor = Executors.newSingleThreadExecutor();
executor.submit(() -> ctx.resume());
} else if ("async-pass-instant".equals(action)) {
ctx.suspend();
ctx.resume();
} else if ("async-fail".equals(action)) {
ctx.suspend();
ExecutorService executor = Executors.newSingleThreadExecutor();
executor.submit(() -> ctx.abortWith(Response.ok(name).build()));
} else if ("async-fail-instant".equals(action)) {
ctx.suspend();
ctx.abortWith(Response.ok(name).build());
} else if ("async-throw-late".equals(action)) {
ctx.suspend();
HttpRequest req = ResteasyContext.getContextData(HttpRequest.class);
ExecutorService executor = Executors.newSingleThreadExecutor();
executor.submit(() -> {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
LOG.error("Error:", e);
}
AsyncResponse resp = req.getAsyncContext().getAsyncResponse();
resp.register((CompletionCallback) (t) -> {
if (callbackException != null)
throw new RuntimeException("Callback called twice");
callbackException = Objects.toString(t);
});
if ("true".equals(req.getHttpHeaders().getHeaderString("UseExceptionMapper")))
ctx.resume(new AsyncFilterException("ouch"));
else
ctx.resume(new Throwable("ouch"));
});
}
LOG.error("Filter request for " + name + " with action: " + action + " done");
}
Aggregations