tomcat-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Vyacheslav Trainin <Vyacheslav.Trai...@playtech.com>
Subject RE: tomcat asynchronous invocation problem
Date Tue, 10 Apr 2012 08:05:24 GMT
I use NIO connector.


-----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


Mime
View raw message