[rabbitmq-discuss] How to shutdown cleanly a Java application using Consumers?

Jason McIntosh mcintoshj at gmail.com
Wed Apr 2 21:35:09 BST 2014

Real quick sample code from the Spring AMQP site:

    ConnectionFactory cf = new CachingConnectionFactory();

    // set up the queue, exchange, binding on the broker
    RabbitAdmin admin = new RabbitAdmin(cf);
    Queue queue = new Queue("myQueue");
    TopicExchange exchange = new TopicExchange("myExchange");

    // set up the listener and container
    SimpleMessageListenerContainer container =
            new SimpleMessageListenerContainer(cf);
    Object listener = new Object() {
        public void handleMessage(String foo) {
    MessageListenerAdapter adapter = new MessageListenerAdapter(listener);

    // send something
    RabbitTemplate template = new RabbitTemplate(cf);
    template.convertAndSend("myExchange", "foo.bar", "Hello, world!");

ON a war, you add shutdown hooks to the web.xml file.  In a non-web
environment, there are shutdown hooks through the Runtime:

In the end, they all call container.shutdown:

Code for that I found here:

The spring libraries are fantastic for RabbitMQ work (though sometimes
there are some headaches on "Which factory is this? Which
MessageProperties do I use?" kinda stuff, but overall they're not bad
and they're getting better.  I tend to be very careful on how much
abstraction I add to my systems (hence why Groovy drives me nuts), but
overall spring is has been very clean implementation wise.


On Wed, Apr 2, 2014 at 3:17 PM, Bertrand Guay-Paquet <bernie at step.polymtl.ca
> wrote:

>  Hi Jason,
> Thanks for the hint, but I'm unfortunately not using Spring for this. Do
> you know how Spring achieves this "shutdown" command? I don't know Spring
> at all but I'll have a look at their doc.
> Regards,
> Bertrand
> On 02/04/2014 4:10 PM, Jason McIntosh wrote:
>  We use consumers here with the spring libraries.  If you use them,
> there's a "Shutdown" command you can call as needed.  We've had pretty good
> luck with it so far.  The spring consumer stuff manages how many consumers
> are running, connection threading, etc. - and it has very good shutdown
> hooks.
>  Jason
> On Wed, Apr 2, 2014 at 3:02 PM, Bertrand Guay-Paquet <
> bernie at step.polymtl.ca> wrote:
>> Hello,
>> I'm using the RabbitMQ Java client API and need some guidance on the
>> proper application shutdown procedure.
>> Here's how I start the application:
>> 1-Create a Connection
>> 2-Create different types of consumers, each with its own channel, and
>> call channel.basicConsume("queue", false, consumer)
>> 3-Let it all run
>> This works great, but I can't figure out how to cleanly shutdown the
>> application. If I simply close the Connection, each created channel
>> immediately (or soon enough) becomes invalid and any Consumer currently
>> doing some work fails when trying to ack their current message or perform
>> any other action on the channel. I'd like to let the consumers finish
>> whatever message they're processing and then close everything down. I guess
>> I need to keep track of the created Consumers and somehow signal them to
>> stop accepting new messages and after they're all done with their current
>> job, close the connection? Is that possible or is there another way? I
>> haven't found any management methods for the consumer classes to control or
>> query their status.
>> The information I found so far is related to manually created threads
>> that poll the queues to process messages. In that case, it's really easy
>> because I can just set a flag on each runnable to exit after processing
>> their current message and join on all the threads before closing the
>> underlying connection. So this leads me to ask, as a side note: are
>> Consumers the way to go to use RabbitMQ in real-world scenarios or should I
>> poll on the queues? It seems to me that Consumers would be the better
>> choice (polling is bad), but if they're less powerful, perhaps they're not
>> a silver bullet in my case.
>> Thank you,
>> Bertrand
>> _______________________________________________
>> rabbitmq-discuss mailing list
>> rabbitmq-discuss at lists.rabbitmq.com
>> https://lists.rabbitmq.com/cgi-bin/mailman/listinfo/rabbitmq-discuss
> --
> Jason McIntosh
> https://github.com/jasonmcintosh/
> 573-424-7612
> _______________________________________________
> rabbitmq-discuss mailing listrabbitmq-discuss at lists.rabbitmq.comhttps://lists.rabbitmq.com/cgi-bin/mailman/listinfo/rabbitmq-discuss
> _______________________________________________
> rabbitmq-discuss mailing list
> rabbitmq-discuss at lists.rabbitmq.com
> https://lists.rabbitmq.com/cgi-bin/mailman/listinfo/rabbitmq-discuss

Jason McIntosh
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.rabbitmq.com/pipermail/rabbitmq-discuss/attachments/20140402/317c4754/attachment.html>

More information about the rabbitmq-discuss mailing list