思路
通过设置死信队列A实现延时,设置超时时间,当消息超时后会转发到设置好的交换机,并通过设置的routing-key放入队列B。消费者消费队列B中的消息,队列A的超时时间就是队列B延时时间。
java代码示例
@Autowired
RabbitAdmin rabbitAdmin;
@Autowired
RabbitTemplate rabbitTemplate;
private void sendDelayMassage(Object message){
Map<String, Object> arguments = new HashMap<String,Object>();
arguments.put("x-message-ttl", (Long)600000);//设置超时时间,以毫秒为单位,这里设置10分钟
arguments.put("x-dead-letter-exchange","roundExchange");//设置死信交换机,超时后转发到该交换机
arguments.put("x-dead-letter-routing-key","roundRoutingKey");//设置死信routing-key,绑定到对应队列
sendMassage(message,"delayExchangeName","delayQueueName", "delayRoutingKey",true,true,arguments);
}
public void sendMassage(Object message,String exchangeName, String queueName, String routingKey,Boolean durableQueue,Boolean durableMessage,Map<String, Object> arguments){
rabbitAdmin.declareExchange(new DirectExchange(exchangeName, durableQueue, false));
rabbitAdmin.declareQueue(new org.springframework.amqp.core.Queue(queueName, durableQueue,false,false, arguments));
rabbitAdmin.declareBinding(new Binding(queueName, Binding.DestinationType.QUEUE,
exchangeName, queueName, new HashMap()));
MessageProperties messageProperties = new MessageProperties();
messageProperties.setDeliveryMode(durableMessage ? MessageDeliveryMode.PERSISTENT : MessageDeliveryMode.NON_PERSISTENT);//设置消息是否持久化
Message m = new Message(JSONObject.toJSONBytes(message), messageProperties);
rabbitTemplate.send(exchangeName, routingKey, m);
}