[
https://issues.apache.org/jira/browse/AMQ-3447?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13687748#comment-13687748
]
Thomas Themel commented on AMQ-3447:
------------------------------------
Acknowledged as a Jetty bug, fixed in HEAD:
https://bugs.eclipse.org/bugs/show_bug.cgi?id=410911
> When MessageListenerServlet is running under servlet3, the continuation is
> not timing out.
> ------------------------------------------------------------------------------------------
>
> Key: AMQ-3447
> URL: https://issues.apache.org/jira/browse/AMQ-3447
> Project: ActiveMQ
> Issue Type: Bug
> Affects Versions: 5.5.0
> Environment: Ubuntu 11.04 using glassfish as web container running
> servlet 3.0 webapp.
> Reporter: Rui Gu
> Labels: Ajax
>
> In MessageListenerServlet.java
> if (message == null &&
> client.getListener().getUndeliveredMessages().size() == 0) {
> Continuation continuation =
> ContinuationSupport.getContinuation(request);
>
> if (continuation.isExpired()) {
> response.setStatus(HttpServletResponse.SC_OK);
> StringWriter swriter = new StringWriter();
> PrintWriter writer = new PrintWriter(swriter);
> writer.println("<ajax-response>");
> writer.print("</ajax-response>");
> writer.flush();
> String m = swriter.toString();
> response.getWriter().println(m);
>
> return;
> }
> continuation.setTimeout(timeout);
> continuation.suspend();
> LOG.debug( "Suspending continuation " + continuation );
>
> // Fetch the listeners
> AjaxListener listener = client.getListener();
> listener.access();
> // register this continuation with our listener.
> listener.setContinuation(continuation);
>
> return;
> }
> Based on above code, the continuation is expected to be expired after given
> timeout when there is no message available for the ajax client and the ajax
> client will then receive an "empty" message. However based on the servlet 3
> Continuation implementation in jetty (Servlet3Continuation.java) the only
> place where the continuation is set to expire is within the below method
> (there is a bug in this method as well).
> public void addContinuationListener(final ContinuationListener listener)
> {
> AsyncListener wrapped = new AsyncListener()
> {
> public void onComplete(final AsyncEvent event) throws IOException
> {
> listener.onComplete(Servlet3Continuation.this);
> }
> public void onError(AsyncEvent event) throws IOException
> {
> listener.onComplete(Servlet3Continuation.this);
> }
> public void onStartAsync(AsyncEvent event) throws IOException
> {
> event.getAsyncContext().addListener(this);
> }
> public void onTimeout(AsyncEvent event) throws IOException
> {
> _expired=true;
> listener.onTimeout(Servlet3Continuation.this);
> }
> };
>
> if (_context==null)
> _context.addListener(wrapped);
> else
> _listeners.add(wrapped);
> }
> Without adding a listener the continuation will never be set to expire,
> therefore the "empty" response is never sent back to the client, the
> connection from the client is resumed and suspended over and over again until
> the connection is aborted by client or there is a message available.
--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira