ActiveMQ可以通过使用消息TTL(Time To Live)特性来实现延迟队列。
具体的配置方法是:
- 在生产者发送消息时,设置消息的expiration时间:
MessageProducer producer = session.createProducer(queue);
//设置消息5秒后过期
message.setLongProperty("AMQ_SCHEDULED_DELAY", 5000);
producer.send(message);
这里使用了AMQ_SCHEDULED_DELAY
自定义属性,设置消息5秒后过期。
- 在消费者端配置TimedMessageSelector选择器:
MessageConsumer consumer = session.createConsumer(queue, "AMQ_SCHEDULED_DELAY <= 0");
这里通过AMQ_SCHEDULED_DELAY <= 0
的条件式选择器,只消费expiration时间超时的消息。
- ActiveMQ Broker配置ScheduledMessagePolicy:
在<broker>
标签中配置:
<policyEntry queue=">" expiration="180000">
<pendingMessagePolicy>
<time-to-live-expiry-policy/>
</pendingMessagePolicy>
</policyEntry>
这里指定了默认的180秒expiration,并使用time-to-live-expiry-policy
策略处理超时的消息。
即Broker在消息到期后,不会主动将其投递给消费者,而是保留在队列中。
- 消费者需要周期性地轮询拉取过期的消息。
因此可以实现基本的延迟队列功能。