在通配符地址上确认消息不会在限定地址上确认相同消息

问题描述

  • Spring JMSListener侦听/queue/app/*
  • 该消息实际上是在/queue/app/XXX生成的,因此也可以在通配符地址(/queue/app/*)上使用以消耗
  • 一旦在侦听器上成功完成处理,便会在通配符地址(/queue/app/*)上确认消息,而不是原始地址(/queue/app/XXX)。

我担心的是,该消息将保留存储空间,直到到期为止。

我们如何解决这个问题?

用例

我的设置如下-

服务A

订阅/queue/A/*

发布到/queue/B/tenantId

服务B,其TenantID = 1

订阅/queue/B/1

发布到/queue/A/1

具有TenantID = 2的服务B

订阅/queue/B/2

发布到/queue/A/2

基本上,服务A 通过针对不同租户的独立队列(/queue/B/tenantId)向服务B 发送消息。为每个租户分配单独队列的想法是消除队列中的租户间竞争。另外,每个租户将运行多个服务B 实例。现在,在完成服务B 的消息处理后,它将把响应消息发布回特定于租户的队列中的服务A /queue/A/tenantId )。这里的想法是在租户响应消息之间进行逻辑隔离。最后,在服务A 中使用通配符地址的原因是,因为我们无法为服务A 中的每个租户指定专门的使用者,因此我们计划在每个租户之间共享通配符地址。

broker-00.xml

 <address-settings>
        <address-setting match="/queue/#">
            <default-address-routing-type>ANYCAST</default-address-routing-type>
            <default-queue-routing-type>ANYCAST</default-queue-routing-type>
        </address-setting>
        <address-setting match="/topic/#">
            <default-address-routing-type>MULTICAST</default-address-routing-type>
            <default-queue-routing-type>MULTICAST</default-queue-routing-type>
        </address-setting>


        <address-setting match="#">
            <auto-delete-queues>false</auto-delete-queues>
            <auto-delete-jms-queues>false</auto-delete-jms-queues>
            <auto-delete-jms-topics>false</auto-delete-jms-topics>
            <auto-delete-addresses>false</auto-delete-addresses>
            
            <max-delivery-attempts>15</max-delivery-attempts>


            <expiry-delay>86400000</expiry-delay>
            <redelivery-delay>3000</redelivery-delay>
            <redelivery-delay-multiplier>1</redelivery-delay-multiplier>
            <redelivery-collision-avoidance-factor>0.15</redelivery-collision-avoidance-factor>
            <max-redelivery-delay>50000</max-redelivery-delay>
            <default-consumer-window-size>0</default-consumer-window-size>
        </address-setting>
    </address-settings>
    <wildcard-addresses>
        <routing-enabled>true</routing-enabled>
        <delimiter>/</delimiter>
        <any-words>#</any-words>
        <single-word>*</single-word>
    </wildcard-addresses>

解决方法

您正在看到预期的行为。请记住,这是通配符地址,而不是通配符 consumer 。发送到与通配符地址匹配的任何地址的邮件将被路由到绑定到通配符地址的队列,并且独立于路由到原始地址发送到特定地址的队列的邮件,对这些消息进行确认。

如果您不希望邮件在任何队列中堆积,则只需删除队列并获取地址即可。没有任何队列的地址是一个完全有效的配置。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...