On 7 Jan 2010, at 22:12, jongraf wrote:


1) So when onMessage() is called, it is actually coming from the prefetch?
Yes - which by default is 1000

2) I'd like to take the messages from the queue and put them in a collection and send that collection to my REST service, this way I only need to make one HTTP call. Do you think I'll be able to do this in my MessageListener?
Should I create a private collection in the Listener?
I'd recommend having a BlockingQueue that you fill fill with messages from onMessage() - and use another thread (Executor) - to pull messages from that Queue and batch up for your HTTP call.


Joe Fernandez wrote:

By default, ActiveMQ sends or streams messages to a consumer's local
buffer in batches. The batching of the messages can be controlled via the
prefetch limit. So AMQ pushes messages to the consumer as opposed to
having the consumer pull each message on demand.

http://activemq.apache.org/what-is-the-prefetch-limit-for.html

So very fast consumers would typically have high prefetch limits and slow
consumers low limits.

If you set the prefetch limit to 0, the consumer will then have to pull
each individual message from the broker.

AFAIK, ActiveMQ does not include a timer that, when it expires, purges a
queue. What about assigning an expiration time to the message?

Joe
http://www.ttmsolutions.com




jongraf wrote:

Hello fellow developers,

I find myself in the midst of the age-old dilemma of needing to provide scalable code where our load tests currently indicate that the code is otherwise. I am coding a message-driven POJO. Originally I implemented the queue using the Spring DefaultMessageListenerContainer and discovered that this is invoked upon every message received (hence, "listener").
Because our load tests are bombarding our server, the performance
benchmarks were not great.

I figured that if I write my own timer instead of a listener, performance would improve. I coded a Quartz-triggered method that calls iterates over jmsTemplate.recieve() for a given batch size. The messages are sent
in one batch to a remote REST service.

This has not improved performance. After doing some research, I found that a caveat of the jmsTemplate is that you do not really want to be calling jmsTemplate.receive() because it opens a new connection & session
each time.  This is bad.

Here is where I need your help:
1) Is there not a way to use the Spring DefaultMessageListenerContainer
to rid the queue of many messages at once?  My confusion lies in the
implementation of the onMessage() method where I believe only one message
is available at a time.

2) Is there a way I can set a timer so that queue is only purged when I want it to be? Perhaps this goes against the MDP pattern but I would
really love some education here.

The forums seem to point to JMS Transactions as a solution for batching objects from a JMS queue. I am also unfamiliar with how to tie this
into the DefaultMessageListenerContainer.

Any help or direction you could provide would be most appreciated.

Thank you,

Jonathan
Developer from NYC




--
View this message in context: 
http://old.nabble.com/Processing-multiple-messages-in-the-queue-at-once-tp27067252p27067952.html
Sent from the ActiveMQ - User mailing list archive at Nabble.com.


Rob Davies
http://twitter.com/rajdavies
I work here: http://fusesource.com
My Blog: http://rajdavies.blogspot.com/
I'm writing this: http://www.manning.com/snyder/





Reply via email to