SpringBoot结合RabbitMQ简单实现订单延迟取消
参考了这位大佬的博客,详细看这里
1.导入jar包
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.10</version>
<scope>provided</scope>
</dependency>
2.配置application.properties文件
server.port=8001 spring.rabbitmq.host=127.0.0.1 spring.rabbitmq.port=5672 spring.rabbitmq.username=guest spring.rabbitmq.password=guest
3.时间常量类
/**
* 配置时间常量
*/
public interface TimeConstants {
/*
* 5秒
*/
Long TEST_TIME = 5 * 1000L;
}
4.定义队列,交换机,路由键枚举类
/**
* 订单队列
*/
public enum QueueEnum {
/**
* 订单延时队列
*/
QUEUE_ORDER_CANCEL("mall.order.direct","mall.order.cancel","mall.order.cancel"),
/**
* 订单延时ttl队列(死信队列)
*/
QUEUE_TTL_ORDER_CANCEL("mall.order.direct","mall.order.cancel.ttl","mall.order.cancel.ttl");
/**
* 交换名称
*/
private String exchange;
/**
* 队列名称
*/
private String name;
/**
* 路由键
*/
private String routeKey;
QueueEnum(String exchange,String name,String routeKey){
this.exchange = exchange;
this.name = name;
this.routeKey = routeKey;
}
public String getExchange(){
return exchange;
}
public String getName(){
return name;
}
public String getRouteKey(){
return routeKey;
}
}
5.绑定队列,交换机,路由键(这里采用的直连交换机)
6.消息生产者
7.消息消费者
@Slf4j
@Component
public class TestReceiver {
@RabbitListener(queues = "mall.order.cancel") //设置队列路由键和监听容器
public void handle(String orderId, Message message, Channel channel) throws IOException {
// 可在这里进行一些逻辑操作
if(orderId.equals("1")){
System.out.println("消费成功,订单编号为: "+orderId);
}
// TODO 通知MQ消息已经成功消费,确认消息
channel.basicAck(message.getMessageProperties().getDeliveryTag(),false);
}
}
8.编写controller类
@RestController
public class TestController {
private static Logger logger = LoggerFactory.getLogger(TestController.class);
@Autowired
private RabbitTemplate rabbitTemplate;
@Autowired
private TestSender testSender;
@GetMapping("/test")
public String test(){
testSender.sendMessage("1",TimeConstants.TEST_TIME);
return "ok";
}
}
9.上手效果图
浏览器输入http://localhost:8001/test
5秒后:
