У меня есть простой Nodejs потребитель (использующий библиотеку: "@ stomp / stomp js": "^ 5.0.2") очереди ActiveMQ, которая выглядит так:
const client = new Client({
brokerURL: `ws://127.0.0.1:61614/ws`,
...
})
client.onConnect = (frame) => {
client.subscribe(queueName, message => {
console.log(`[${new Date()}] Received message [${message}]`)
process.exit(1)
}, { ack: 'client-individual', 'activemq.prefetchSize': '1' })
}
Я пытаюсь заставить DLQ работать, но я не успешен. Моя конфигурация брокера выглядит следующим образом:
...
<broker>
...
<destinationPolicy>
<policyMap>
<policyEntries>
<policyEntry gcInactiveDestinations="true" inactiveTimoutBeforeGC="600000" queue=">" prioritizedMessages="true">
<deadLetterStrategy>
<sharedDeadLetterStrategy processNonPersistent="true">
</sharedDeadLetterStrategy>
</deadLetterStrategy>
</policyEntry>
</policyEntries>
</policyMap>
</destinationPolicy>
<plugins>
<redeliveryPlugin fallbackToDeadLetter="true" sendToDlqIfMaxRetriesExceeded="true">
<redeliveryPolicyMap>
<redeliveryPolicyMap>
<defaultEntry>
<redeliveryPolicy initialRedeliveryDelay="5000" maximumRedeliveries="5" redeliveryDelay="10000"/>
</defaultEntry>
</redeliveryPolicyMap>
</redeliveryPolicyMap>
</redeliveryPlugin>
</plugins>
</broker>
Это сообщение доставляется снова и снова. После просмотра исходного кода active-mq у меня сложилось впечатление, что RedeliveryPlugin используется только после подтверждения, то есть только клиент может заставить сообщение помещаться в DLQ. Как я могу решить проблему, показанную в тривиальном примере, например, когда указанное сообщение c приводит к тому, что cra sh потребителя и потребитель не имеют возможности уведомить брокера.
Я бы реализовал nack на стороне потребителя, но проблема это я не нашел, как получить доступ к JMSXDeliveryCount
свойство через Stomp
(https://activemq.apache.org/activemq-message-properties).