Hi,

A brief outline of my set up: 5 dual core machines, one running activemq and
a message producer communicating via a queue with 8 consumers spread across
the other 4 machines. 2 classes of message, 2 of the consumers have
selectors set so that they only select one class of message, the other 6
accept either class of message. Consumption of messages of the selected
class takes approximately 0.1 seconds, consumption of the other class takes
approximately 7 seconds. Message consumption is single threaded on each
consumer, and more or less completely chews up all of a single core's
processing time. 

The loop to consume and process messages is as follows, i.e. the consumer
blocks until it receives a message:

while(keepLooping){
                        try{
                                message=consumer.receive();
                        }catch(JMSException e){
                                logger.warn("Problem with Node 
MessageConsumer.receive().", e);
                                sleep(1000);
                                continue;
                        }                       
                        //Check message isn't null
                        if(message==null){//Can this ever occur?
                                sleep(1000);
                                continue;
                        }
                        //Unwrap message
                        try{
                                
m=(ServerMessage)(((ObjectMessage)message).getObject());
                        }catch (Exception e){
                                logger.info("Failed to extract ServerMessage 
from "+m+". Message
discarded.");
                                continue;
                        }
                        //Process message
                        process(m);
                }//end while(keepLooping)

My problem is that when I look at the status of the queue on jconsole, often
there will be a few (i.e. 1 to 5) messages on the queue whilst many of the
consumers aren't doing anything. Messages are small, on the order of 1-2kb
at most. I changed the prefetch value to 1 for the generic consumers and 3
for the selector consumers, but this does not seem to have fixed the
behaviour. The broker has enqueued/dequeued approximately 340000 messages at
this point in time. Consumers have been restarted a number of times,
including very recently, and this has not affected the behaviour. 

To give an idea of the size of delays, sometimes messages are received by a
consumer 2 minutes or more after they have been sent, when it is clear that
the total amount of processing time required for all messages sent is much,
much, much less than the consumer time available, i.e. there is no load
explanation for the delay. In particular the queue never grew to more than 4
or 5 pending messages in this 2 minute period, hence the greatest possible
load delay would have been 10 seconds rather than 2 minutes.

Does anyone have any ideas as to what might be causing this?

Many thanks for your responses in advance.

Best Regards,

Steve Siller
-- 
View this message in context: 
http://www.nabble.com/Blocking-consumers-not-consuming-immediately-tf4023758s2354.html#a11428816
Sent from the ActiveMQ - User mailing list archive at Nabble.com.

Reply via email to