You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@activemq.apache.org by "Guangnuan.Liu" <gu...@gmail.com> on 2006/09/07 05:48:45 UTC
A bug found in souce code of activemq web demo
The web demo is deployed together with Tomcat 5.0. The Send a messager
function in the page http://localhost:8080/activemq-web-demo-4.0.2/ is
well, but the Receive a message function consumes two messages a time from a
queue. I had been troubled by this strange behavior of
activemq-web-demo-4.0.2 for several days. As I am new to Java, xml, and
activemq, my colleague helped me in finding the bug in source code in
trunk\activemq-web\src\main\java\org\apache\activemq\web\MessageServlet.java.
Let's have a look at doMessages method in MessageServlet.java. There is an
excessive message = consumer.receiveNoWait(); operation in the while cycle.
It just consumes a message and does nothing when invoked by doGet. I comment
out this line then the code works fine.
/**
* Reads a message from a destination up to some specific timeout period
*
* @param request
* @param response
* @throws ServletException
* @throws IOException
*/
protected void doMessages(HttpServletRequest request,
HttpServletResponse response, int maxMessages) throws ServletException,
IOException {
int messages = 0;
try {
WebClient client = WebClient.getWebClient(request);
Destination destination = getDestination(client, request);
if (destination==null)
throw new NoDestinationSuppliedException();
long timeout = getReadTimeout(request);
boolean ajax = isRicoAjax(request);
if (!ajax)
maxMessages = 1;
if (log.isDebugEnabled()) {
log.debug("Receiving message(s) from: " + destination + "
with timeout: " + timeout);
}
MessageAvailableConsumer consumer = (MessageAvailableConsumer)
client.getConsumer(destination);
Continuation continuation = null;
Listener listener = null;
Message message = null;
synchronized (consumer) {
// Fetch the listeners
listener = (Listener) consumer.getAvailableListener();
if (listener == null) {
listener = new Listener(consumer);
consumer.setAvailableListener(listener);
}
// Look for any available messages
message = consumer.receiveNoWait();
// Get an existing Continuation or create a new one if there
are
// no events.
if (message == null) {
continuation =
ContinuationSupport.getContinuation(request, consumer);
// register this continuation with our listener.
listener.setContinuation(continuation);
// Get the continuation object (may wait and/or retry
// request here).
continuation.suspend(timeout);
}
// Try again now
if (message == null)
message = consumer.receiveNoWait();
// write a responds
response.setContentType("text/xml");
PrintWriter writer = response.getWriter();
if (ajax)
writer.println("<ajax-response>");
// handle any message(s)
if (message == null) {
// No messages so OK response of for ajax else no
content.
response.setStatus(ajax ? HttpServletResponse.SC_OK :
HttpServletResponse.SC_NO_CONTENT);
}
else {
// We have at least one message so set up the response
response.setStatus(HttpServletResponse.SC_OK);
String type = getContentType(request);
if (type != null)
response.setContentType(type);
// send a response for each available message (up to max
// messages)
while ((maxMessages < 0 || messages < maxMessages) &&
message != null) {
//
System.err.println("message["+messages+"]="+message);
if (ajax) {
writer.print("<response type='object' id='");
writer.print(request.getParameter("id"));
writer.println("'>");
}
else
// only ever 1 message for non ajax!
setResponseHeaders(response, message);
writeMessageResponse(writer, message);
if (ajax)
writer.println("</response>");
// look for next message
message = consumer.receiveNoWait(); //This line
should be commented out.
messages++;
}
}
if (ajax) {
writer.println("<response type='object'
id='poll'><ok/></response>");
writer.println("</ajax-response>");
}
}
}
catch (JMSException e) {
throw new ServletException("Could not post JMS message: " + e,
e);
}
finally {
if (log.isDebugEnabled()) {
log.debug("Received " + messages + " message(s)");
}
}
}
--
View this message in context: http://www.nabble.com/A-bug-found-in-souce-code-of-activemq-web-demo-tf2230955.html#a6183760
Sent from the ActiveMQ - User forum at Nabble.com.