AbstractPollingMessageListenerContainer#receiveMessage currently blocks indefinitely both on negative values and 0 as receiveTimeout. The documentation for receiveTimeout mentions -1, but not 0. However, MessageConsumer#receive blocks if the timeout is 0 and AbstractPollingMessageListenerContainer uses receive() or receive(timeout) - never receiveNoWait().
In some cases, for example with Oracle AQ, receiveNoWait yields better performance.
It is very simple to fix this. Simply check for 0 and call receiveNoWait. I will create a pull request.