For those who interested I opened Bug 53061 for this issue
-----Original Message-----
From: Mark Thomas [mailto:markt@apache.org]
Sent: Tuesday, April 10, 2012 10:52 AM
To: Tomcat Users List
Subject: RE: tomcat asynchronous invocation problem
Vyacheslav Trainin <Vyacheslav.Trainin@playtech.com> wrote:
>I reproduced it on:
> - tomcat-7.0.23 and 7.0.25
> - java 64 bit 1.6.0_18 and 1.6.0_29
> - Linux CentOS release 5.6 (Final) 64 bit
One one other question - which connector were you using? BIO, NIO, or
APR/native? HTTP or AJP?
With that information it looks like you have enough here to open a bug report
in Bugzilla.
Mark
>
>
>
>-----Original Message-----
>From: Pid [mailto:pid@pidster.com]
>Sent: Monday, April 09, 2012 8:37 PM
>To: Tomcat Users List
>Subject: Re: tomcat asynchronous invocation problem
>
>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]
---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@tomcat.apache.org
For additional commands, e-mail: users-help@tomcat.apache.org
|