参考了这位大佬的博客,详细看这里
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.绑定队列,交换机,路由键(这里采用的直连交换机)

@AllArgsConstructor
public class OrderDirectExchangeConfig {/*** 订单实际消费队列* @return*/@Beanpublic Queue orderQueue(){return new Queue(QueueEnum.QUEUE_ORDER_CANCEL.getName());}/*** 订单延迟队列(死信队列)* 存放延迟队列,最终会转发到exchange交换机(到实际消费队列上)*/@Beanpublic Queue orderTtlQueue(){return QueueBuilder.durable(QueueEnum.QUEUE_TTL_ORDER_CANCEL.getName()).withArgument("x-dead-letter-exchange",QueueEnum.QUEUE_ORDER_CANCEL.getExchange())  // 到期后转发的交换机.withArgument("x-dead-letter-routing-key",QueueEnum.QUEUE_ORDER_CANCEL.getRouteKey()) // 到期后转发的路由键.build();}/*** 订单消息实际消费绑定的交换机(开启持久化)*/@BeanDirectExchange orderExchange(){return (DirectExchange) ExchangeBuilder.directExchange(QueueEnum.QUEUE_ORDER_CANCEL.getExchange())// 开启持久化,如果服务器宕机消息依旧存在.durable(true).build();}/*** 订单队列绑定到交换机上*/@BeanBinding orderBinding(DirectExchange orderExchange, Queue orderQueue){return BindingBuilder.bind(orderQueue).to(orderExchange).with(QueueEnum.QUEUE_ORDER_CANCEL.getRouteKey());}/*** 订单延迟死信队列 绑定到交换机上*/@BeanBinding orderTtlBinding(DirectExchange orderExchange,Queue orderTtlQueue){return BindingBuilder.bind(orderTtlQueue).to(orderExchange).with(QueueEnum.QUEUE_TTL_ORDER_CANCEL.getRouteKey());}
}

6.消息生产者

@AllArgsConstructor
public class OrderDirectExchangeConfig {/*** 订单实际消费队列* @return*/@Beanpublic Queue orderQueue(){return new Queue(QueueEnum.QUEUE_ORDER_CANCEL.getName());}/*** 订单延迟队列(死信队列)* 存放延迟队列,最终会转发到exchange交换机(到实际消费队列上)*/@Beanpublic Queue orderTtlQueue(){return QueueBuilder.durable(QueueEnum.QUEUE_TTL_ORDER_CANCEL.getName()).withArgument("x-dead-letter-exchange",QueueEnum.QUEUE_ORDER_CANCEL.getExchange())  // 到期后转发的交换机.withArgument("x-dead-letter-routing-key",QueueEnum.QUEUE_ORDER_CANCEL.getRouteKey()) // 到期后转发的路由键.build();}/*** 订单消息实际消费绑定的交换机*/@BeanDirectExchange orderExchange(){return (DirectExchange) ExchangeBuilder.directExchange(QueueEnum.QUEUE_ORDER_CANCEL.getExchange())// 开启持久化,如果服务器宕机消息依旧存在.durable(true).build();}/*** 订单队列绑定到交换机上*/@BeanBinding orderBinding(DirectExchange orderExchange, Queue orderQueue){return BindingBuilder.bind(orderQueue).to(orderExchange).with(QueueEnum.QUEUE_ORDER_CANCEL.getRouteKey());}/*** 订单延迟队列 绑定到交换机上*/@BeanBinding orderTtlBinding(DirectExchange orderExchange,Queue orderTtlQueue){return BindingBuilder.bind(orderTtlQueue).to(orderExchange).with(QueueEnum.QUEUE_TTL_ORDER_CANCEL.getRouteKey());}
}

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);@Autowiredprivate RabbitTemplate rabbitTemplate;@Autowiredprivate TestSender testSender;@GetMapping("/test")public String test(){testSender.sendMessage("1",TimeConstants.TEST_TIME);return "ok";}
}

9.上手效果图

浏览器输入http://localhost:8001/test



5秒后:

SpringBoot结合RabbitMQ简单实现订单延迟取消相关推荐

  1. SpringBoot 结合 RabbitMQ 简单项目

    https://git.coding.net/dgutllx/RabbitmqStudy.git 上面就是我博客里面的项目,感谢大大,学习到不少 publisher-confirms,实现一个监听器用 ...

  2. springboot整合RabbitMQ实现延时自动取消订单

    1.pom依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>s ...

  3. ribbonmq超时配置_使用RabbitMQ实现订单超时取消(延迟队列)

    使用RabbitMQ实现订单超时取消,大致流程: 生产者生产一条设置了TTL的延迟取消订单消息=>延迟队列交换机(通过绑定路由键)=>消息投递至延迟队列=>消息延迟队列时间到期=&g ...

  4. SpringBoot整合RabbitMQ 消息可靠投递、手动ack、延迟队列、死信队列、消息幂等性保障、消息积压

    1.消息可靠投递 在使用 RabbitMQ 的时候,作为消息发送方希望杜绝任何消息丢失或者投递失败场景.RabbitMQ 为我们提供了两种方式用来控制消息的投递可靠性模式. confirm 确认模式 ...

  5. RabbitMQ,Springboot整合RabbitMQ实现 消息可靠性投递,Consumer ACK,TTL,死信队列,使用TTL+死信队列=延迟队列

    搭建SpringBoot项目,用于演示 springboot版本 <!-- spring boot --><dependency><groupId>org.spri ...

  6. Springboot----项目整合微信支付(引入延迟队列实现订单过期取消以及商户主动查单)

    前言 目前更新的是Springboot项目整合微信支付系列的文章,可以在我的主页中找到该系列其他文章,这一系列的文章将会系统介绍如何在项目中引入微信支付的下单.关单.处理回调通知等功能.由于前面创作经 ...

  7. Jmeter Springboot Redisson分布式锁并发订单操作(下单、取消单、完成单、加库存)

    Jmeter+Springboot+Redisson分布式锁并发订单操作(下单.取消单.完成单.加库存) 涉及知识点: java+springboot+mybatis开发 redis分布式锁+Redi ...

  8. Springboot使用DelayQueue实现订单自动取消

    DelayQueue小结 DelayQueue是一个有序的无界BlockingQueue,用于放置实现了Delayed接口的对象,其中的对象在到期时才能从队列中取走. DelayQueue只能添加实现 ...

  9. 如何处理因为支付成功后因延迟回调而订单被取消

    工作中遇到的问题记录 如何处理因为支付成功后因延迟回调而订单被取消 如何处理因为支付成功后因延迟回调而订单被取消 这个问题的出现背景也是因为第三方结算平台延迟反馈而造成用户错以为没有支付而取消订单或者 ...

最新文章

  1. 4、列举你工作中遇到的IE6 BUG,谈谈解决方案
  2. Bag-of-words model
  3. Http接口设计(1)Token之前
  4. linux中设置环境变量PATH的方法(转)
  5. app.config数据库路径问题
  6. 程序员面试金典 - 面试题 16.20. T9键盘(数组)
  7. WebAPI基本封装
  8. apicloud退出app方法
  9. python设置tk退出_Tkinter退出按钮
  10. 漏桶算法和令牌桶算法
  11. (六)Value Function Approximation-LSPI code (3)
  12. 送书 |《Python大数据与机器学习实战》
  13. ANC降噪蓝牙耳机软件工程的数学原理
  14. APP如何上架App Store?
  15. 基于sass的前端样式管理方案
  16. python心得总结知识点和收获,千锋Python培训心得 在总结中收获提升
  17. 最优化理论——阻尼牛顿法
  18. 改善C#程序的建议1:非用ICloneable不可的理由
  19. 【MongoDB 快速上手】别找了,主流开源分布式系统存储系统三剑客:FastDFS、Minio、MongoDB零基础入门实战教程!
  20. 【0049】报错:fe_sendauth: invalid authentication request from server: AUTH_REQ_SASL_CONT without

热门文章

  1. oppo机器如何没Root激活Xposed框架的方法
  2. 使用云之讯API借口发送短信(Java,Json版)
  3. Spring Cloud Sleuth + zipkin + kafka
  4. 免费最新iOS 13.0、iOS 13.1真机调试包,不需要积分
  5. tess4j linux so文件,linux tesseract 安装及部署tess4j项目的常见问题
  6. MATLAB循环运算
  7. NFC音响耳机、故事机
  8. CentOS7安装Scrot
  9. 在项目管理中,甘特图是最常用的工具之一
  10. 跨境电商时区解决方案