在 ActiveMQ Artemis 中为每个消费者创建 DLQ

Create DLQ per-consumer in ActiveMQ Artemis

我正在使用 JMS 使用来自 ActiveMQ Artemis 主题的消息。我的消费者直接连接到他们消费者队列的 FQQN。像这样:

jmsTemplate.setDefaultDestinationName("Transactions.Client1::ConsumerA");

broker.xml中的配置是:

<address-setting match="Transactions.*">
    <auto-create-dead-letter-resources>true</auto-create-dead-letter-resources>
    <dead-letter-address>Transactions.Retry</dead-letter-address>
</address-setting>

但是,DLQ 的名称将是 DLQ.Transactions.Client1,没有消费者名称。

我需要的是每个消费者都有自己的DLQ。类似于 DLQ.Transactions.Client1.ConsumerA。这可能吗?

编辑:

当我说“消费者”时,它可能(实际上)更像是一个“消费者群体”。例如,ConsumerAConsumerB 是两个完全不同的应用程序,具有(可能)多个 运行 实例并由其自己的团队管理。这就是为什么我要为每个不同的 DLQ。

无法将代理配置为 auto-create dead-letter 队列,其名称包含最初发送消息的队列的名称。如 the documentation 中所述,dead-letter 队列根据消息最初发送的 地址 以及任何配置的前缀 and/or 后缀命名。

但是,消息本身将有一个名为 _AMQ_ORIG_QUEUE 的 属性,它将包含最初路由消息的队列的名称。这意味着您可以使用带有消息选择器(例如 _AMQ_ORIG_QUEUE = 'ConsumerA')的消费者,这样消费者将 接收最初路由到特定队列的消息。这 在功能上等同于 具有 dead-letter 队列 per-queue。

就其价值而言,您所说的“消费者名称”根本不是消费者的名称,至少从经纪人的角度来看不是。这只是队列的名称。

最终无法配置 dead-letter 队列 per-queue。每个地址只能配置一个 dead-letter 队列。无论资源是手动创建(例如通过 broker.xml)还是自动创建,都是如此。

Justin Bertram 的回答可能是大多数人应该做的。如果不是因为每个消费者应用程序具有不同的死信地址和到期地址的要求,我就会这样做。

就我而言,我使用 Diverts.

解决了它

首先,制作人没有变。它一直在主题 Transactions.Client1.

上发帖

然后,我在broker.xml文件中配置了一个转移:

<divert name="Transactions.Divert">
    <address>Transactions.Client1</address>
    <forwarding-address>Transactions.Client1.ConsumerA</forwarding-address>
    <exclusive>false</exclusive>
</divert>

重要提示: 缺点是它无法扩展。如果我有 N 个客户和 M 个消费者,我将有 N×M 个转移。

然后,address-settings 更改为(注意匹配属性中的两个星号):

<address-setting match="Transactions.*.*">
    <auto-create-dead-letter-resources>true</auto-create-dead-letter-resources>
    <dead-letter-address>Transactions.Retry</dead-letter-address>
</address-setting>

因此,当消息处理失败时,将在地址 Transactions.Retry 处创建一个名为 DLQ.Transactions.Client1.ConsumerA.

的队列

每个人都很高兴,除了运维人员,他将不得不在生产中配置一百多个转移。希望他的vim-fu没事

PS:提示:始终转移到具有相同前缀的地址(在示例中为“交易”)。当您必须在生产环境中配置集群时,它会让您的生活变得更加轻松。