use of javax.servlet.AsyncEvent in project spring-framework by spring-projects.
the class StandardServletAsyncWebRequestTests method onTimeoutHandler.
@Test
public void onTimeoutHandler() throws Exception {
Runnable timeoutHandler = mock(Runnable.class);
this.asyncRequest.addTimeoutHandler(timeoutHandler);
this.asyncRequest.onTimeout(new AsyncEvent(new MockAsyncContext(this.request, this.response)));
verify(timeoutHandler).run();
}
use of javax.servlet.AsyncEvent in project spring-framework by spring-projects.
the class StandardServletAsyncWebRequestTests method onCompletionHandler.
@Test
public void onCompletionHandler() throws Exception {
Runnable handler = mock(Runnable.class);
this.asyncRequest.addCompletionHandler(handler);
this.asyncRequest.startAsync();
this.asyncRequest.onComplete(new AsyncEvent(this.request.getAsyncContext()));
verify(handler).run();
assertTrue(this.asyncRequest.isAsyncComplete());
}
use of javax.servlet.AsyncEvent in project spring-framework by spring-projects.
the class StandardServletAsyncWebRequestTests method onTimeoutDefaultBehavior.
@Test
public void onTimeoutDefaultBehavior() throws Exception {
this.asyncRequest.onTimeout(new AsyncEvent(new MockAsyncContext(this.request, this.response)));
assertEquals(200, this.response.getStatus());
}
use of javax.servlet.AsyncEvent in project spring-framework by spring-projects.
the class StandardServletAsyncWebRequestTests method onCompletionHandlerAfterOnErrorEvent.
// SPR-13292
@Test
public void onCompletionHandlerAfterOnErrorEvent() throws Exception {
Runnable handler = mock(Runnable.class);
this.asyncRequest.addCompletionHandler(handler);
this.asyncRequest.startAsync();
this.asyncRequest.onError(new AsyncEvent(this.request.getAsyncContext()));
verify(handler).run();
assertTrue(this.asyncRequest.isAsyncComplete());
}
use of javax.servlet.AsyncEvent in project rest.li by linkedin.
the class AbstractAsyncR2Servlet method service.
@Override
public void service(final HttpServletRequest req, final HttpServletResponse resp) throws ServletException, IOException {
RequestContext requestContext = readRequestContext(req);
RestRequest restRequest;
try {
restRequest = readFromServletRequest(req);
} catch (URISyntaxException e) {
writeToServletError(resp, RestStatus.BAD_REQUEST, e.toString());
return;
}
final AsyncContext ctx = req.startAsync(req, resp);
ctx.setTimeout(_timeout);
ctx.addListener(new AsyncListener() {
@Override
public void onTimeout(AsyncEvent event) throws IOException {
AsyncContext ctx = event.getAsyncContext();
writeToServletError((HttpServletResponse) ctx.getResponse(), RestStatus.INTERNAL_SERVER_ERROR, "Server Timeout");
ctx.complete();
}
@Override
public void onStartAsync(AsyncEvent event) throws IOException {
// Nothing to do here
}
@Override
public void onError(AsyncEvent event) throws IOException {
writeToServletError((HttpServletResponse) event.getSuppliedResponse(), RestStatus.INTERNAL_SERVER_ERROR, "Server Error");
ctx.complete();
}
@Override
public void onComplete(AsyncEvent event) throws IOException {
Object exception = req.getAttribute(TRANSPORT_CALLBACK_IOEXCEPTION);
if (exception != null)
throw new IOException((IOException) exception);
}
});
TransportCallback<RestResponse> callback = new TransportCallback<RestResponse>() {
@Override
public void onResponse(final TransportResponse<RestResponse> response) {
// TransportCallback is usually invoked by non-servlet threads; hence we cannot assume that it's ok to
// do blocking IO there. As a result, we should use AsyncContext.start() to do blocking IO using the
// container/servlet threads. This still maintains the advantage of Async, meaning servlet thread is not
// blocking-wait when the response is not ready.
ctx.start(new Runnable() {
@Override
public void run() {
try {
writeToServletResponse(response, (HttpServletResponse) ctx.getResponse());
} catch (IOException e) {
req.setAttribute(TRANSPORT_CALLBACK_IOEXCEPTION, e);
} finally {
ctx.complete();
}
}
});
}
};
getDispatcher().handleRequest(restRequest, requestContext, callback);
}
Aggregations