问题描述
如果我们在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-count
和auto-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 -->
这将在指定时间后删除没有消息且未正确取消订阅的队列