ActiveMQ的延迟队列如何配置?

ActiveMQ可以通过使用消息TTL(Time To Live)特性来实现延迟队列。

具体的配置方法是:

  1. 在生产者发送消息时,设置消息的expiration时间:
MessageProducer producer = session.createProducer(queue);

//设置消息5秒后过期
message.setLongProperty("AMQ_SCHEDULED_DELAY", 5000);  

producer.send(message);

这里使用了AMQ_SCHEDULED_DELAY自定义属性,设置消息5秒后过期。

  1. 在消费者端配置TimedMessageSelector选择器:
MessageConsumer consumer = session.createConsumer(queue, "AMQ_SCHEDULED_DELAY <= 0");

这里通过AMQ_SCHEDULED_DELAY <= 0的条件式选择器,只消费expiration时间超时的消息。

  1. ActiveMQ Broker配置ScheduledMessagePolicy:
    <broker>标签中配置:
<policyEntry queue=">" expiration="180000">  
   <pendingMessagePolicy>  
         <time-to-live-expiry-policy/>  
   </pendingMessagePolicy>   
</policyEntry>

这里指定了默认的180秒expiration,并使用time-to-live-expiry-policy策略处理超时的消息。
即Broker在消息到期后,不会主动将其投递给消费者,而是保留在队列中。

  1. 消费者需要周期性地轮询拉取过期的消息。
    因此可以实现基本的延迟队列功能。