我正在使用Spring Boot应用程序,该应用程序使用Spring的JmsTemplate
将消息发送到ActiveMQ Artemis队列。如果磁盘空间已满并且队列阻塞,则对JmsTemplate
的任何convertAndSend
调用都将永远挂起。最好给我一个错误。
ActiveMQ具有此配置,即sendFailIfNoSpace
:
<systemUsage>
<systemUsage sendFailIfNoSpace="true">
<memoryUsage>
<memoryUsage limit="20 mb"/>
</memoryUsage>
</systemUsage>
</systemUsage>
是否也可以配置Artemis队列来执行此操作?
应用程序中的一些细节是:
Spring自动配置的JmsTemplate
调用:
jmsTemplate.convertAndSend("just another message");
Artemis代理具有所涉及的任何队列的默认设置:
<address-setting match="#">
<dead-letter-address>DLQ</dead-letter-address>
<expiry-address>ExpiryQueue</expiry-address>
<redelivery-delay>0</redelivery-delay>
<!-- with -1 only the global-max-size is in use for limiting -->
<max-size-bytes>-1</max-size-bytes>
<message-counter-history-day-limit>10</message-counter-history-day-limit>
<address-full-policy>PAGE</address-full-policy>
<auto-create-queues>true</auto-create-queues>
<auto-create-addresses>true</auto-create-addresses>
<auto-create-jms-queues>true</auto-create-jms-queues>
<auto-create-jms-topics>true</auto-create-jms-topics>
</address-setting>
[目前在ActiveMQ Artemis中没有与sendFailIfNoSpace
等效的文件。如the documentation中所述,当超出max-disk-usage
时,代理将阻止:
系统将对磁盘执行扫描,以确定磁盘是否超出配置的限制。这些通过百分比
max-disk-usage
进行配置。一旦达到该限制,任何消息将被阻止。 (除非协议不支持在这种情况下的流控制,否则将引发异常并断开那些客户端的连接)。
要清楚,客户端呼叫不会被阻止[[forever。它们将被阻塞,直到释放磁盘上足够的空间。