Details
Description
Summary:
Transactional Acknowledgement with Virtual Topic / Subscriber Queues does not indicate which subscriber had a problem consuming the messages. Messages are simply delivered to Topic specific DLQ rather than to the Subscriber/Consumer specific DLQ.
Steps to create issue:
Configure the Individual Dead Letter Queue policy in Fuse Message Broker.
Next create an ActiveMQ Virtual Topic with Subscriber Queue(s).
Send messages to Virtual Topic
Rollback/abort ack for one message (consistently) until this message gets delivered to the dead letter queue.
Result:
Message is sent to the Topic Specific Dead Letter Queue rather than to the DLQ specific to the Subscriber Queue.
Resolution:
Patch and unit test are are attached.
This test verifies that all undelivered messages sent to a consumers listening on a queue associated with a virtual topic with be forwarded to separate DLQ's.
Note that the broker config, Individual Dead Letter Strategy, needs to have the enable audit set to false to allows duplicate messages sent from a topic to individual consumers to be forwarded to the DLQ's.
<deadLetterStrategy>
<bean xmlns="http://www.springframework.org/schema/beans" class="org.apache.activemq.broker.region.policy.IndividualDeadLetterStrategy">
<property name="useQueueForQueueMessages" value="true"></property>
<property name="processNonPersistent" value="true"></property>
<property name="processExpired" value="false"></property>
<property name="enableAudit" value="false"></property>
</bean>
</deadLetterStrategy>