Artemis STOMP:地址或队列到期

问题描述

如果我们在STOMP中使用durable subscriptions,是否可以为队列或地址设置过期时间?

Artemis默认情况下会自动删除自动创建的队列,但“持久”订阅队列将永远保留。我尝试设置expiry-delay address-setting,如果未定义expiry-address,它将删除邮件。但是,Artemis仍会保留订阅队列,这会导致服务器内存不足。我必须每3天删除Docker中的容器。您可以想象,这根本不好。

不幸的是,这种情况通常发生在客户端关闭浏览器而不取消订阅的情况下。

这是broker.xml的相关部分:

<address-setting match="#">
    <expiry-delay>3600000</expiry-delay> <!-- 1 hours -->
    <default-address-routing-type>MULTICAST</default-address-routing-type>

    <dead-letter-address>DLQ</dead-letter-address>
    <!--<expiry-address>ExpiryQueue</expiry-address>-->
    <redelivery-delay>15000</redelivery-delay>
    <max-delivery-attempts>10</max-delivery-attempts>

    <max-size-bytes>-1</max-size-bytes>
    <address-full-policy>PAGE</address-full-policy>
    <auto-create-addresses>true</auto-create-addresses>
    <auto-delete-addresses>true</auto-delete-addresses>

    <auto-create-queues>true</auto-create-queues>
    <auto-delete-queues>true</auto-delete-queues>

    <auto-create-jms-queues>true</auto-create-jms-queues>
    <auto-create-jms-topics>true</auto-create-jms-topics>
    <auto-delete-jms-queues>true</auto-delete-jms-queues>
    <auto-delete-jms-topics>true</auto-delete-jms-topics>
</address-setting>

解决方法

用于STOMP持久订阅的队列不认为是自动创建的,因为客户端专门要求持久订阅。拥有持久订阅的全部目的在于,它将保留在客户端未连接时发送的消息。如果客户端在不取消订阅的情况下断开连接,则认为其最终将重新连接并使用其持久订阅中的消息。

当然,某些客户不会这样做,这就是您面临的问题。您可能会考虑持久订阅是否真的是您想要的。当然,非持久订阅不会遇到这个问题。

但是,如果必须使用持久订阅,则应将auto-delete-created-queues设置为true,然后可以将auto-delete-queues-message-countauto-delete-queues-delay调整为满足您的需求,例如:

<address-setting match="yourAddress">
    <auto-delete-created-queues>true</auto-delete-created-queues>
    <auto-delete-queues-message-count>-1</auto-delete-queues-message-count>
    <auto-delete-queues-delay>3600000</auto-delete-queues-delay>
</address-setting>

这种设置的组合将确保在最后一个使用者断开连接后1小时,无论地址yourAddress上的任何持久订阅队列都被删除,无论它包含多少消息。

另外,请注意这些设置已被弃用,因此您不应使用它们:

<auto-create-jms-queues>true</auto-create-jms-queues>
<auto-create-jms-topics>true</auto-create-jms-topics>
<auto-delete-jms-queues>true</auto-delete-jms-queues>
<auto-delete-jms-topics>true</auto-delete-jms-topics>
,

升级到2.15.0后,它可以按预期工作。

由以下原因引起:org.xml.sax.SAXParseException; cvc-complex-type.2.4.a: 发现无效的内容以元素“ auto-delete-delay”开头。

我当前的配置:

<expiry-delay>3600000</expiry-delay> <!-- 1 hours -->
<auto-delete-created-queues>true</auto-delete-created-queues>
<auto-delete-queues-delay>3600000</auto-delete-queues-delay> <!-- 1 hours -->

这将在指定时间后删除没有消息且未正确取消订阅的队列

相关问答

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