MQTT protocol converters does not correctly generate unique packet ids for retained and non-retained publish messages sent to clients. MQTT requires that all Publish messages with QoS > 0 must have a unique packet id which can be used by clients to coordinate the PUBACK, PUBREC, PUBREL and PUBCOMP messages depending upon the QoS flow.
Although retained messages published on creation of client subscriptions are copies of retained messages, they must carry a unique packet id when dispatched to clients. ActiveMQ re-uses the retained message's packet id, which makes it difficult to acknowledge these messages when wildcard topics are used.
ActiveMQ also sends the same non-retained message multiple times for every matching subscription for overlapping subscriptions. These messages also re-use the publisher's message id as the packet id, which breaks client acknowledgment.
A patch is included, which fixes all the above scenarios. It generates a unique packet id for every publish (retained and non-retained), and also ensures that redelivery on the same connection will re-use message ids, with the dup flag set. The patch also maps JMS redelivery status for a subscription to the MQTT Dup flag to indicate duplicate messages. Unit tests are included to test correct packet id generation.