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

Reply via email to