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秒后: