It appears there may be a bug SimpleMessageListenerContainer's doStart() method. What we saw was we would set 10 consumers for the container, but RabbitMQ was reporting that there were 20. After further debugging, it was clear that the doStart() method on the listener container was being called twice.
We're using the RC2 of spring-amqp (still there in 1.0GA).
Some quick background. We had originally been using an old 1.0.0 snapshot of spring-integration-amqp. Since it was not quite mature we had to write our own AmqpInboundEndpoint, which just copied the original, but with the added functionality of copying message headers. Additionally, we added a way to pass in the MessageListenerContainer (which we had had to subclass). Note: we intend to toss all this when spring-integration-amqp goes GA.
In one particular instance, we had declared the message listener container as a top level bean and then referenced it in the inbound endpoint. Because the listener was a top level bean, it's doStart() method was being called. It was getting called a second time by the inbound endpoint's start() method.
Now, I've noticed that in the spring-integration-amqp's trunk, you can pass in your message listener via the constructor, and it's autoStartup property is immediately set to false, so it probably alleviates this problem, but I would think the message listener should still guard against having it's doStart() method called twice.
What was happening was effectively each channel was shared by two threads, with I believe is a no no and we were getting duplicate acks.