前置条件
RabbitMQ服务端需要安装rabbitmq_delayed_message_exchange插件
一)、引入依赖
<!-- 引入RabbitMQ 消息中间件依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
二)、在需要使用RabbitMQ的服务模块编写配置文件
spring:
rabbitmq:
host: 127.0.0.1
username: 123456
password: 123456
port: 5672
# 开启消息手动应答
listener:
direct:
acknowledge-mode: MANUAL
simple:
acknowledge-mode: MANUAL
三)、编写RabbitMQ配置类
/**
* RabbitMQ 配置类
* <p>
* 说明:
* 1. 定义超时支付订单队列
* 2. 定义广播模式的延时交换机
* 3. 绑定超时支付订单队列与延时交换机
* 4. 定义消息模板用于发布消息,并且设置其消息转换器
*
* @author MoCha
* @date 2020/4/14
*/
public class RabbitMqConfig {
/**
* 定义超时支付订单队列
*
* @return 超时支付订单队列
*/
@Bean
public Queue timeOutOrderQueue() {
// 表示持久化该队列,RabbitMQ服务重启后该队列仍旧保留
return QueueBuilder.durable(RabbitMqConstants.TIMEOUT_ORDER_QUEUE).build();
}
/**
* 定义广播模式的延时交换机 无需绑定路由
*/
@Bean
public Exchange delayExchange() {
Map<String, Object> arguments = new HashMap<>(4);
arguments.put("x-delayed-type", "direct");
// 如果不调用autoDelete()方法,那么autoDelete就是false
// 可以不调用durable(boolean isDurable),默认为true
// 调用delayed()后,delayed变量设置为true
return ExchangeBuilder.fanoutExchange(RabbitMqConstants.DELAY_EXCHANGE)
.withArguments(arguments).delayed().build();
}
/**
* 绑定超时支付订单队列与延时交换机
*/
@Bean
public Binding delayExchangeAndTimeOutOrderQueueBinding() {
return BindingBuilder.bind(timeOutOrderQueue()).to(