Apply patch to work around known race condition. 

git-svn-id: https://svn.apache.org/repos/asf/activemq/trunk@1494681 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Timothy A. Bish 2013-06-19 16:31:36 +00:00
parent 5415f3a6aa
commit 166ab43c90
2 changed files with 28 additions and 30 deletions

View File

@ -16,30 +16,27 @@
*/ */
package org.apache.activemq.web; package org.apache.activemq.web;
import java.util.LinkedList;
import javax.jms.Message; import javax.jms.Message;
import javax.jms.MessageConsumer; import javax.jms.MessageConsumer;
import org.apache.activemq.MessageAvailableListener;
import org.eclipse.jetty.continuation.Continuation; import org.eclipse.jetty.continuation.Continuation;
import org.eclipse.jetty.continuation.ContinuationSupport;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.apache.activemq.MessageAvailableListener;
import java.util.LinkedList;
/* /*
* Listen for available messages and wakeup any continuations. * Listen for available messages and wakeup any continuations.
*/ */
public class AjaxListener implements MessageAvailableListener { public class AjaxListener implements MessageAvailableListener {
private static final Logger LOG = LoggerFactory.getLogger(AjaxListener.class); private static final Logger LOG = LoggerFactory.getLogger(AjaxListener.class);
private long maximumReadTimeout; private final long maximumReadTimeout;
private AjaxWebClient client; private final AjaxWebClient client;
private long lastAccess; private long lastAccess;
private Continuation continuation; private Continuation continuation;
private LinkedList<UndeliveredAjaxMessage> undeliveredMessages = new LinkedList<UndeliveredAjaxMessage>(); private final LinkedList<UndeliveredAjaxMessage> undeliveredMessages = new LinkedList<UndeliveredAjaxMessage>();
AjaxListener(AjaxWebClient client, long maximumReadTimeout) { AjaxListener(AjaxWebClient client, long maximumReadTimeout) {
this.client = client; this.client = client;
@ -59,6 +56,7 @@ public class AjaxListener implements MessageAvailableListener {
return undeliveredMessages; return undeliveredMessages;
} }
@Override
public synchronized void onMessageAvailable(MessageConsumer consumer) { public synchronized void onMessageAvailable(MessageConsumer consumer) {
if (LOG.isDebugEnabled()) { if (LOG.isDebugEnabled()) {
LOG.debug("message for " + consumer + " continuation=" + continuation); LOG.debug("message for " + consumer + " continuation=" + continuation);
@ -68,7 +66,7 @@ public class AjaxListener implements MessageAvailableListener {
Message message = consumer.receive(10); Message message = consumer.receive(10);
LOG.debug("message is " + message); LOG.debug("message is " + message);
if (message != null) { if (message != null) {
if( continuation.isSuspended() ) { if (!continuation.isResumed()) {
LOG.debug("Resuming suspended continuation " + continuation); LOG.debug("Resuming suspended continuation " + continuation);
continuation.setAttribute("undelivered_message", new UndeliveredAjaxMessage(message, consumer)); continuation.setAttribute("undelivered_message", new UndeliveredAjaxMessage(message, consumer));
continuation.resume(); continuation.resume();
@ -83,6 +81,7 @@ public class AjaxListener implements MessageAvailableListener {
} else if (System.currentTimeMillis() - lastAccess > 2 * this.maximumReadTimeout) { } else if (System.currentTimeMillis() - lastAccess > 2 * this.maximumReadTimeout) {
new Thread() { new Thread() {
@Override
public void run() { public void run() {
client.closeConsumers(); client.closeConsumers();
}; };

View File

@ -425,7 +425,6 @@ public class MessageListenerServlet extends MessageServletSupport {
String m = swriter.toString(); String m = swriter.toString();
response.getWriter().println(m); response.getWriter().println(m);
} }
} }
protected void writeMessageResponse(PrintWriter writer, Message message, String id, String destinationName) throws JMSException, IOException { protected void writeMessageResponse(PrintWriter writer, Message message, String id, String destinationName) throws JMSException, IOException {