在 wildcard-address 上确认消息不会在 qualified-address 上确认相同的消息
Acknowledging the message on wildcard-address does not acknowledge the same message on the qualified-address
- Spring JMSListener 在
/queue/app/*
处侦听
- 消息实际上是在
/queue/app/XXX
生成的,因此也可以在通配符地址 ( /queue/app/*
) 上使用
- 一旦在侦听器处成功处理,将在通配符地址 (
/queue/app/*
) 而非原始地址 (/queue/app/XXX
) 确认消息。
我担心的是邮件会保留存储空间直到过期。
我们如何解决这个问题?
用例
我的设置如下-
服务 A
订阅/queue/A/*
发布到 /queue/B/tenantId
TenantID = 1 的服务 B
订阅/queue/B/1
发布到 /queue/A/1
TenantID = 2 的服务 B
订阅 /queue/B/2
发布到 /queue/A/2
基本上,服务 A 通过不同租户的独立队列(/queue/B/tenantId
)向 服务 B 发送消息。每个租户单独队列背后的想法是消除队列内的租户间竞争。此外,每个租户将有多个 Service B运行 实例。现在,一旦 Service B 完成了消息处理,它就会将响应消息发布回租户特定队列上的 Service A (/queue/A/tenantId
)。这里的想法是在租户响应消息之间进行逻辑隔离。最后,在 Service A 中使用 wildcard-address 的原因是因为我们无法为 Service A 中的每个租户提供专门的消费者,我们计划跨租户共享。
经纪人-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>
您看到了预期的行为。请记住,它是通配符 address,而不是通配符 consumer。发送到与通配符地址匹配的任何地址的消息将被路由到绑定到通配符地址的队列,并且这些消息的确认独立于路由到最初发送它们的特定地址队列的消息。
如果您不希望消息堆积在任何队列中,则只需删除队列并只获取地址即可。没有任何队列的地址是完全有效的配置。
- Spring JMSListener 在
/queue/app/*
处侦听
- 消息实际上是在
/queue/app/XXX
生成的,因此也可以在通配符地址 (/queue/app/*
) 上使用 - 一旦在侦听器处成功处理,将在通配符地址 (
/queue/app/*
) 而非原始地址 (/queue/app/XXX
) 确认消息。
我担心的是邮件会保留存储空间直到过期。
我们如何解决这个问题?
用例
我的设置如下-
服务 A
订阅/queue/A/*
发布到 /queue/B/tenantId
TenantID = 1 的服务 B
订阅/queue/B/1
发布到 /queue/A/1
TenantID = 2 的服务 B
订阅 /queue/B/2
发布到 /queue/A/2
基本上,服务 A 通过不同租户的独立队列(/queue/B/tenantId
)向 服务 B 发送消息。每个租户单独队列背后的想法是消除队列内的租户间竞争。此外,每个租户将有多个 Service B运行 实例。现在,一旦 Service B 完成了消息处理,它就会将响应消息发布回租户特定队列上的 Service A (/queue/A/tenantId
)。这里的想法是在租户响应消息之间进行逻辑隔离。最后,在 Service A 中使用 wildcard-address 的原因是因为我们无法为 Service A 中的每个租户提供专门的消费者,我们计划跨租户共享。
经纪人-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>
您看到了预期的行为。请记住,它是通配符 address,而不是通配符 consumer。发送到与通配符地址匹配的任何地址的消息将被路由到绑定到通配符地址的队列,并且这些消息的确认独立于路由到最初发送它们的特定地址队列的消息。
如果您不希望消息堆积在任何队列中,则只需删除队列并只获取地址即可。没有任何队列的地址是完全有效的配置。