Java Artemis STOMP:地址或队列到期

Java Artemis STOMP:地址或队列到期,java,stomp,activemq-artemis,Java,Stomp,Activemq Artemis,如果在STOMP中使用,是否可以设置队列或地址的过期时间 默认情况下,Artemis会自动删除自动创建的队列,但“持久”订阅队列将永远保留。我已尝试设置到期延迟地址设置,如果未定义到期地址,该设置将删除邮件。但是,Artemis仍然保留订阅队列,这会导致服务器内存不足。我必须每3天删除Docker中的容器。你可以想象,这一点都不好 不幸的是,当客户端关闭浏览器而不取消订阅时,这种情况经常发生 以下是broker.xml的相关部分: 3600000 多播 DLQ 15000 10 -1 页 真的

如果在STOMP中使用,是否可以设置队列或地址的过期时间

默认情况下,Artemis会自动删除自动创建的队列,但“持久”订阅队列将永远保留。我已尝试设置
到期延迟
地址设置
,如果未定义
到期地址
,该设置将删除邮件。但是,Artemis仍然保留订阅队列,这会导致服务器内存不足。我必须每3天删除Docker中的容器。你可以想象,这一点都不好

不幸的是,当客户端关闭浏览器而不取消订阅时,这种情况经常发生

以下是
broker.xml
的相关部分:


3600000
多播
DLQ
15000
10
-1
页
真的
真的
真的
真的
真的
真的
真的
真的

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

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

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


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

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

true
真的
真的
真的

升级到2.15.0后,它可以正常工作

原因:org.xml.sax.saxpasseeption;cvc复合型2.4.a: 发现以元素“自动删除延迟”开头的无效内容

我当前的配置:

<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 -->
3600000
真的
3600000

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

谢谢您的帮助。我们确实需要“持久订阅”,所以在SpringFrameFork中安装了Artemis,而不是默认的订阅。但是,如果客户端尚未取消订阅,这并不能解决删除地址的问题。我理解长期订阅的本质,但在到期时随意销毁不必要的地址,而不是永远存储它们,这是合乎逻辑的,因为在我们的例子中,这只会造成伤害。我提供了一个解决方案,用于删除持久订阅的队列。假设相应的地址是自动创建的,那么当没有更多的队列绑定到它时,它将被自动删除。您是否看到了不同的行为(即未绑定队列的延迟地址)?问题是,在用户取消订阅之前,队列将存在,地址也随之存在。因此,我看到这样的地址不断地累积,并出现了死气沉沉的不必要的队列。我不明白。你是否应用了我在回答中概述的解决方案?如前所述,它应该删除订阅队列。所有操作都完全正确,但没有如我所预期的那样工作。在使用稍微不同的配置更新到2.15.0之后,它按预期工作。再次感谢您的帮助澄清,代理不知道持久订户没有“正确”取消订阅。这些设置将删除符合配置的任何队列。此配置仍然存在消息堆积的风险,因为它要求队列包含0条消息(与我的回答不同)。应该使用到期延迟删除消息,这非常有效,但我一直在测试消息将被删除,但每条消息都必须等待
到期延迟
过去。考虑消息<代码> < <代码>到达队列并接收1小时的<代码>期满延迟<代码>的情况。然后在59分钟后,消息
B
到达队列,并收到1小时的
到期延迟。消息
A
将在消息
B
到达后1分钟删除,但消息
B
将在队列中再停留59分钟。如果这种情况持续发生,队列将永远不会被删除。为了使邮件计数达到0并删除队列,1小时内不能收到任何新邮件。