On 09/04/2012 13:53, Vyacheslav Trainin wrote: > Hi, > > > > We encountered a problem during asynchronous operations (tomcat 7 with > servlet 3).
Exactly which version of Tomcat 7.0? Same for Java version? Same for OS version(s)? p > _Description: _ > > One client continuously sends post requests to the server. On the server > side for each request created AsyncContext with timeout 20 seconds: > > AsyncContextasyncContext = req.startAsync(req, resp); > > asyncContext.setTimeout(20000); > > As expected after approximately 20 sec the requests are completed. Then > another client also begins to send requests to the server but in this > case they are explicitly completed after 500 milliseconds. Something > like this: > > AsyncContextasyncContext = req.startAsync(req, resp); > > asyncContext.setTimeout(20000); > > > > *try*{ > > Thread./sleep/(500); > > } *catch*(Exception e) { > > } > > > > asyncContext.complete(); > > > > The problem is that after running the second client all the requested > waiting for timeout (from the first client) are stuck and not released > (onTimeout method of AsyncEvent is not called) until the second client > stops sending requests. > > It looks like the problem occurs on Linux but not on Windows. > > > > Below is a simple test that may help to reproduce this issue. The > following servlet accepts URL parameter “complete”. > > When “complete=1” the request will be completed after 500ms. > > Otherwise the request will wait till timeout (20 seconds). > > > > Run client that periodically sends requests to /servlet?complete=0. (I > have tested it with 10 parallel threads that run in a loop) > > Then run another client that periodically sends requests to > /servlet?complete=1 (This client can use only a single thread) > > See that the first client does not receive any responses while the > second client is running. > > > > > > public class WebTestServlet extends HttpServlet { > > private static final Logger LOG = > LoggerFactory.getLogger(WebTestServlet.class); > > > > @Override > > protected void service(final HttpServletRequest req, final > HttpServletResponse resp) throws ServletException, IOException { > > LOG.debug("Received request: {}", req); > > final long startTime = System.currentTimeMillis(); > > String isComplete = req.getParameter("complete"); > > > > AsyncContext asyncContext = req.startAsync(req, resp); > > asyncContext.setTimeout(20000); > > asyncContext.addListener(new AsyncListener() { > > public void onTimeout(AsyncEvent event) throws IOException { > > long duration = System.currentTimeMillis() - startTime; > > LOG.debug("Async Timeout. Request: {}. Waiting time: > {}", event.getSuppliedRequest(), duration); > > event.getAsyncContext().complete(); > > } > > > > public void onStartAsync(AsyncEvent event) throws IOException { > > LOG.debug("Start async. Request: {}", > event.getSuppliedRequest()); > > } > > > > public void onError(AsyncEvent event) throws IOException { > > LOG.debug("Error occured. Request: {}. Error: {}", > event.getSuppliedRequest(), event.getThrowable()); > > } > > > > public void onComplete(AsyncEvent event) throws IOException { > > long duration = System.currentTimeMillis() - startTime; > > LOG.debug("Async Complete. Request: {}. Request process > time: {}", event.getSuppliedRequest(), duration); > > } > > }, req, resp); > > > > if ("1".equals(isComplete)) { > > try { > > Thread.sleep(500); > > } catch (Exception e) { > > } > > > > asyncContext.complete(); > > } > > } > > } > > > > Regards, > > Slava > > > > > -- [key:62590808]
signature.asc
Description: OpenPGP digital signature