如何在ActiveMQ Artemis中配置定时消息?配置后不生效如何解决
问题根因
你混用了ActiveMQ 5和Artemis的配置项,且使用了过时的消息属性,导致定时消息不生效,按以下步骤修正即可:
1. 修正服务端配置
你在bootstrap.xml中添加的schedulerSupport="true"是ActiveMQ 5的配置参数,对Artemis完全无效,可直接删除。Artemis的定时消息功能需要在核心配置文件中开启:
- 打开你配置的核心配置文件
/opt/activemq/apache-artemis-home/etc/broker.xml - 找到
<core>标签块,添加如下配置开启定时消息功能:
<core> <!-- 其他原有配置 --> <!-- 单位为字节,这里配置的是10MB,按需调整即可,只要不为-1就会开启定时消息 --> <scheduled-message-max-size>10485760</scheduled-message-max-size> </core>
- 保存配置后重启Artemis服务。
2. 修正客户端代码
你使用的_HQ_SCHED_DELIVERY是HornetQ(Artemis的前身)的旧属性名,已经废弃。Artemis下两种常见的定时配置方式如下,根据你使用的客户端协议选择即可:
如果你用Artemis原生客户端/核心协议
直接使用Artemis标准属性_AMQ_SCHED_DELIVERY,值为目标投递时间的毫秒级时间戳,和你原有逻辑一致,示例:
try { ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory("tcp://10.0.34.96:61616"); Connection connection = factory.createConnection(); connection.start(); Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); Destination queue = session.createQueue("TEST"); MessageProducer producer = session.createProducer(queue); producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT); // 计算50秒后投递的时间戳 long schedDelivery = System.currentTimeMillis() + 50000; String msg = "Hello World (test SCHED_DELIVERY) " + schedDelivery; TextMessage message = session.createTextMessage(msg); // 使用Artemis标准定时投递属性 message.setLongProperty("_AMQ_SCHED_DELIVERY", schedDelivery); System.out.println("Producer Sent: " + msg); producer.send(message); session.close(); connection.close(); } catch (Exception ex) { ex.printStackTrace(); }
如果你用ActiveMQ 5客户端通过OpenWire协议对接Artemis
可以直接使用你注释掉的ScheduledMessage.AMQ_SCHEDULED_DELAY常量,值为需要延迟的毫秒数,不需要手动计算时间戳:
// 延迟50秒投递 message.setLongProperty(ScheduledMessage.AMQ_SCHEDULED_DELAY, 50000);
验证方法
修改完后发送消息,可先登录Artemis控制台http://10.0.34.96:8161/console,查看TEST队列的消息数,50秒内消息会停留在队列中不会被消费,到期后才会投递到消费者,就说明配置生效。
内容的提问来源于stack exchange,提问作者user1625812
相关产品推荐
相关产品推荐

