我正在使用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
的东西。这可能吗?
编辑:
当我说";消费者";,它可能(实际上(更像是一个";消费者群体";。例如,ConsumerA
和ConsumerB
是两个完全不同的应用程序,有(可能(多个正在运行的实例,并由自己的团队管理。这就是为什么我希望每个DLQ都不同。
无法将代理配置为自动创建死信队列,该队列的名称包含最初发送消息的队列的名称。如文档中所述,死信队列是根据消息最初发送的地址以及任何配置的前缀和/或后缀命名的。
但是,消息本身将具有一个名为_AMQ_ORIG_QUEUE
的属性,该属性将包含消息最初路由的队列的名称。这意味着您可以将使用者与消息选择器(例如_AMQ_ORIG_QUEUE = 'ConsumerA'
(一起使用,这样使用者将仅接收最初路由到特定队列的消息。这在功能上相当于每个队列有一个死信队列。
就其价值而言,你称之为";消费者名称";根本不是消费者的名字,至少从经纪人的角度来看不是。这只是队列的名称。
最终,不可能为每个队列配置死信队列。只能为每个地址配置一个死信队列。无论是手动创建资源(例如通过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-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
的队列。
每个人都很高兴,除了操作人员,他将不得不在生产中配置一百多个分流。我希望他的活力还可以。
附言:只是一个提示:总是转移到具有相同前缀的地址(在示例中是"事务"(。当您必须在生产中配置集群时,这将使您的生活更加轻松。