rabbitmq死信队列:当消息在队列中过期,消息就会被投放到是死信Exchange
demo地址:https://github.com/foxiaotao/springboot-rabbitmq-demo
1、消息的过期分为两种:一种方式是设置队列的TTL,该队列中所有的消息的过期时间都一样,当消息过期后,消息跟根据Queue设置的死信Exchang 和routingkey路由到某个队列
在申明队列是其参数中:
"x-dead-letter-exchange", LIND_DL_EXCHANGE)//设置该队列的死信交换机 .
"x-message-ttl", makeCallExpire:队列消息延迟时间
"x-dead-letter-routing-key", LIND_DEAD_QUEUE)//设置死信routingKey
2、另外一种是设置消息的过期时间:
package com.foxiaotao.springbootmq.deadletter.sendmsg;
import com.foxiaotao.springbootmq.deadletter.model.Order;
import com.foxiaotao.springbootmq.deadletter.util.JSONTools;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.MessageDeliveryMode;
import org.springframework.amqp.core.Queue;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import javax.annotation.Resource;
@Slf4j
@Controller
@RequestMapping("test")
public class MqSender {
@Resource(name = "orderRabbitTemplate")
private RabbitTemplate rabbitTemplate;
@Value("${spring.mq.exchange}")
private String orderExchange;
@Value("${spring.mq.routingKey}")
private String orderRoutingKey;
/**
* 发送带有过期时间的消息
*/
@GetMapping("/sendDlx")
public void sendDlx() {
Order order = new Order();
order.setItemId(1);
order.setStatus(1);
log.info("send msg" + System.currentTimeMillis());
rabbitTemplate.convertAndSend(orderExchange, orderRoutingKey,
JSONTools.serialize(order), message -> {
message.getMessageProperties().setDeliveryMode(MessageDeliveryMode.PERSISTENT);
message.getMessageProperties().setExpiration("30000");
return message;
});
}
}
每条消息可以设置不用的过期时间。当消息过期后,消息重新放到exchange=LIND_DL_EXCHANGE。其LIND_DL_EXCHANGE本身可以看做普通的exchange,该怎么路由怎么路由,该怎么消费还是怎么消费