Hi,
I'm just starting out with using the Servlet 3.1 asynchronous processing
API.
I use the API for generating response content, that can potentially be a
slow process, in another thread.
The code appears to be working, but since the specification contains many
caveats, I'd like to try and verify correctness.
There's a couple of parts in particular that I'm wondering about:
- what's the correct way to deliver error response to client? Can I just
cast the response acquired from AsyncContext to HttpServletResponse and use
the normal Servlet API mechanisms?
- does the code contain thread-safety issues in particular related to the
response object and OutputStream?
Here's a simplified version of my code:
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
final AsyncContext asyncContext = req.startAsync();
asyncContext.start(new Runnable() {
@Override
public void run() {
HttpServletResponse response = null;
try {
response = (HttpServletResponse)asyncContext;
if(hasOperationFailed()) {
response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
} else {
response.getOutputStream().write(generateResponseContent().getBytes());
}
} catch (IOException e) {
try {
response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
} catch (IOException e1) {
e1.printStackTrace();
}
}
asyncContext.complete();
}
});
}
Any feedback and pointers would be welcome.
marko