1、什么是死信队列
当消息在一个队列中变成一个死信之后, 它将被重新publish到另一 个交换机上, 这个交换机
我们就叫做死信交换机,**交换机将死信投递到一个队列上就是死信队列。具体原理如图
2、项目搭建
创建boot项目并选择rabbitmq对应版本
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
创建相关的交换机和队列
package com.wkt.config;
import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.DirectExchange;
import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.HashMap;
/**
* @author 小王
* @version 1.1
* @description: Class
* @date 2021/9/7 19:08
*/
@Configuration
public class RabbitMqConfig {
//忽略我的命名 哈哈哈哈
//队列名字
public final static String QueueName = "orderQueue";
//交换机名字
public final static String mqExchange = "orderExchange";
//routingKey
public final static String mqRoutingKey = "mqRoutingKey";
//死信队列名字
public final static String dieMqQueue = "dieMqQueue";
//死信队列交换机
public final static String dieMqExchange = "dieMqExchange";
//死信队列 routingKey
public final static String dieMqRoutingKey = "dieMqRoutingKey";
//死信队列标识符"
public final static String dieMqTag = "x-dead-letter-exchange";
//死信队列交换机标识符 routing key
public final static String DieMqExchangeTag = "x-dead-letter-routing-key";
//创建队列
@Bean
public Queue orderQueue() {
HashMap<String, Object> map = new HashMap<>(2);
map.put(dieMqTag, dieMqExchange);
map.put(DieMqExchangeTag, dieMqRoutingKey);
return new Queue(QueueName, true, false, false, map);
}
//声明交换机
@Bean
public DirectExchange directExchange() {
return new DirectExchange(mqExchange);
}
//绑定order队列到交换机 指定routingKey
@Bean
public Binding binding() {
return BindingBuilder.bind(orderQueue()).to(directExchange()).with(mqRoutingKey);
}
//创建死信队列
@Bean
public Queue dieQueue() {
return new Queue(dieMqQueue, true);
}
//创建私信交换机
@Bean
public DirectExchange dieDirectExchange() {
return new DirectExchange(dieMqExchange);
}
//死信队列的routingKey绑定
@Bean
public Binding dieBinDing() {
return BindingBuilder.bind(dieQueue()).to(dieDirectExchange()).with(dieMqRoutingKey);
}
}
发送消息类
package com.wkt.controller;
import com.wkt.config.RabbitMqConfig;
import lombok.extern.java.Log;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import java.util.UUID;
/**
* @author 小王
* @version 1.1
* @description: Class
* @date 2021/9/7 19:33
* 消息生产设 客户端
*/
@Log
@RestController
public class OrderConsumption {
@Resource
private RabbitTemplate rabbitTemplate;
//生产设发送消息
@RequestMapping("/sendMessage")
public String sendMessage() {
String s = UUID.randomUUID().toString();
log.info(s);
rabbitTemplate.convertAndSend(
RabbitMqConfig.mqExchange,//订单交换机
RabbitMqConfig.mqRoutingKey,//订单routingKey
s, //发送的队列名字
message -> { //设置消息过期时间
message.getMessageProperties().setExpiration(1000 * 10 + "");
return message;
}
);
return s;
}
}
创建接收消息的监听类
package com.wkt.listene;
import com.wkt.config.RabbitMqConfig;
import lombok.extern.java.Log;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
/**
* @author 小王
* @version 1.1
* @description: Class
* @date 2021/9/7 20:10
*/
@Component
@Log
public class RabbitmqListener {
//获取死信队列的名字
final String queue = RabbitMqConfig.dieMqQueue;
//监听死信队列
@RabbitListener(queues = queue)
public void message(String order) {
log.info(order);
System.out.println("执行结束2");
}
}
配置文件
#项目运行端口
server:
port: 8081
#mq的相关配置
spring:
rabbitmq:
host: localhost
port: 5672
username: guest
password: guest
3、效果
通过网页发送消息
后台接收打印
以上便是一个简单的死信队列搭建 可以用在很多场景 例如 交易订单
大佬们快快动起手来吧