当前位置: 首页 > 知识库问答 >
问题:

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

皇甫福
2023-03-14

我正在使用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这样的东西。这可能吗?

编辑:

我说的“消费者”,可能(实际上)更像是一个“消费群体”。例如,< code>ConsumerA和< code>ConsumerB是两个完全不同的应用程序,有(可能)多个运行实例,由自己的团队管理。这就是为什么我希望每个人都有不同的DLQ。

共有2个答案

慕容品
2023-03-14

贾斯汀·伯特伦的回答可能是大多数人应该做的。如果不是因为每个消费者申请都有不同的死信地址和到期地址的要求,我也会这么做。

在我的例子中,我使用转向器解决了这个问题。

第一,制作人没换。它一直发布到主题<代码>事务客户端1。

然后,我在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的队列。

每个人都很开心,除了运维人员,他将不得不在生产中配置一百多个分流。我希望他的维姆夫没事。

PS:只是一个提示:总是转移到具有相同前缀的地址(在这个例子中是“交易”)。当您必须在生产环境中配置集群时,这将使您的生活变得更加轻松。

百里阳平
2023-03-14

不可能将代理配置为自动创建死信队列,该队列的名称包含最初发送消息的队列的名称。如文档中所述,死信队列是根据最初发送消息的地址以及任何配置的前缀和/或后缀来命名的。

但是,消息本身将有一个名为<code>_AMQ_ORIG_QUEUE_AMQ_ORIG_QUEUE='ConsumerA'),这样消费者将只接收最初路由到特定队列的消息。这在功能上等同于每个队列有一个死信队列。

不管怎样,你所谓的“消费者的名字”根本不是消费者的名字,至少从经纪人的角度来看不是。它只是队列的名称。

最终,不可能为每个队列配置死信队列。只能为每个地址配置死信队列。无论资源是手动创建的(例如通过broker.xml)还是自动创建的,都是如此。

 类似资料:
  • 我刚刚开始玩弄《Spring-Cloud-Stream》中的Kafka活页夹。 我配置了一个简单的消费者: 但当我启动应用程序时,我看到在启动日志中创建了三个独立的消费者配置: 我发现这些配置之间唯一不同的是客户机。id。 除此之外,我不知道为什么只有一个消费者有三种配置。 是因为我也在运行吗? 这是我的:

  • 我想为几个主题创建一个kafka消费者。consumer的方法构造函数允许我在订阅中传输主题列表的参数,如下所示: 之后,我想轮询记录从Kafka流每3秒并处理它们,但我想知道什么是这个消费者-如何将不同主题的记录轮询-首先一个主题,然后另一个,或并行。会不会一个消息量大的主题会一直处理,另一个消息量小的主题会等待?

  • 那么我如何确保我的队列中只有一个消费者呢?

  • 问题内容: 可用的库是sarama(或其扩展sarama- cluster ),但是没有提供消费者群体示例,在sarama或sarama-cluster中均未提供。 我不了解API。我可以举一个为主题创建消费者组的示例吗? 问题答案: 消费方组由集群消费方“构造函数”的第二个参数指定。这是一个非常基本的草图: 因此,您将拥有一个属于指定消费者组的消费者。

  • 假设我有一个服务,它通过kafka-rest-proxy来消费消息,并且总是在同一个消费者组上。我们还可以说,它正在消耗一个有一个分区的主题。当服务启动时,它在kafka-rest-proxy中创建一个新的使用者,并使用生成的使用者url,直到服务关闭。当服务重新启动时,它将在kafka-rest-proxy中创建一个新的消费者,并使用新的url(和新的消费者)进行消费。 > 因为kafka每个分

  • 我使用的是camel-kafka版本。以下是KafkaURI: 请注意,我在URI选项中使用了。但是,当我一次将多条消息发布到主题时(全部发布到同一个分区),kafka使用者将依次接收这些消息。怎样才能同时接收到这些信息? 我正在寻找如下的解决方案: 是我用来从ibm MQ中同时读取的内容