My project uses ActiveMQ and we have a requirement to support priority queues for one or more of our configured queues. One of the suggestions under the ActiveMQ FAQ is to use a Resequencer, so I followed the link and applied the <resequence> element to my XML-based route. While testing this functionality we uncovered a couple issues that seem like they should be addressed in a future release of camel-core.
- The JMSPriority header is not a unique field and internally the Resequencer class uses java.util.Set to collect messages into a batch. This means that a given batch cannot contain multiple messages with the same JMSPriority. For example, if I use the default batch config and submit five messages with JMSPriority=6 to the queue within a second, only one of those message is delivered to the configured endpoint.
- According to the JMS API, priority has ten values where 0 is the lowest and 9 is the highest. This means that messages with higher priorities should be processed before messages with lower priorities. When I configure my resequencer with <header>JMSPriority</header>, however, it by default orders the messages within the batch in ascending order which means that messages with lower priorities are processed first.
If there are any known workarounds to these issues please document them, because the current Resequencer documentation that uses JMSPriority as an example is misleading.