如何在ActiveMQ Artemis中实现消息延迟10秒投递?
ActiveMQ Artemis实现消息投递前10秒延迟的方案
完全可以实现消息投递到消费者前延迟10秒的需求,下面是两种常用的实现方式:
1. 单消息层面设置延迟
发送消息时,通过JMS属性给特定消息设置延迟时间。在Web服务器的JMS客户端代码中,给消息添加AMQ_SCHEDULED_DELAY属性,值设为10000(单位毫秒):
Message message = session.createTextMessage("你的消息内容"); message.setLongProperty("AMQ_SCHEDULED_DELAY", 10000); producer.send(message);
这种方式适合仅需给部分特定消息添加延迟的场景。
2. 全局/队列层面配置默认延迟
如果希望所有发送到目标队列的消息都默认延迟10秒,可以修改broker.xml的address-settings配置,添加<default-delay>节点。
比如针对全局所有地址/队列设置,修改你现有的配置:
<address-settings> <address-setting match="#"> <dead-letter-address>DLQ</dead-letter-address> <expiry-address>ExpiryQueue</expiry-address> <redelivery-delay>0</redelivery-delay> <default-delay>10000</default-delay> <!-- 添加这行,指定10秒默认延迟 --> <auto-create-dead-letter-resources>true</auto-create-dead-letter-resources> <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> <auto-delete-queues>false</auto-delete-queues> <auto-delete-addresses>false</auto-delete-addresses> <auto-delete-jms-queues>false</auto-delete-jms-queues> <auto-delete-jms-topics>false</auto-delete-jms-topics> <expiry-delay>60000</expiry-delay> </address-setting> </address-settings>
若只想给某个特定队列设置延迟,把match="#"改成match="你的队列名称"即可,这样只有匹配的队列会应用该延迟规则。
注意:延迟时间从消息成功到达Broker的时间开始计算,到Broker允许将消息投递给消费者的时间间隔,确保Broker时间同步即可保证延迟精度。
内容的提问来源于stack exchange,提问作者Albaasith
相关产品推荐
相关产品推荐

