springboot整合rabbitmq之-发送延时消息取消超时订单
1搭建项目开发环境
1.1安装rabbitmq
RabbitMQ是实现了高级消息队列协议(AMQP)的开源消息代理软件(亦称面向消息的中间件)。RabbitMQ服务器是用语言编写的,而集群和故障转移是构建在框架上的。所有主要的编程语言均有与代理接口通讯的客户端。
1.2下载rabbitmq
安装rabbitmq,需要先安装 下载地址:http://erlang.org/download
安装如下图
安装RabbitMQ,下载地址:https://dl.bintray.com/rabbitmq/all/rabbitmq-server/3.7.14/rabbitmq-server-3.7.14.exe
安装完成后,进入RabbitMQ安装目录下的sbin目录
4.在地址栏输入cmd并回车启动命令行,然后输入以下命令启动管理功能:
rabbitmq-plugins enable rabbitmq_management
5.访问地址查看是否安装成功:http://localhost:15672/
1.3启动idea开始集成rabbitmq
-
找到项目配置文件
#整合rabbitmq rabbitmq: host: localhost ##服务器端口 port: 5672 virtual-host: / username: guest password: guest publisher-confirms: true #如果对异步消息需要回调必须设置为true
-
添加rabbitmq配置类
-
配置生产者消费者类
@Component public class CancelOrderSender { private static Logger LOGGER = LoggerFactory.getLogger(CancelOrderSender.class); @Autowired private AmqpTemplate amqpTemplate; public void sendMessage(Long orderId,final long delayTimes){ //给延迟队列发送消息 amqpTemplate.convertAndSend(QueueEnum.QUEUE_TTL_ORDER_CANCEL.getExchange(), QueueEnum.QUEUE_TTL_ORDER_CANCEL.getRouteKey(), orderId, new MessagePostProcessor() { @Override public Message postProcessMessage(Message message) throws AmqpException { //给消息设置延迟毫秒值 message.getMessageProperties().setExpiration(String.valueOf(delayTimes)); return message; } }); LOGGER.info("send orderId:{}",orderId); } }
@Component @RabbitListener(queues = "mall.order.cancel") public class CancelOrderReceiver { private static Logger LOGGER = LoggerFactory.getLogger(CancelOrderReceiver.class); @RabbitHandler public void handle(Long orderId){ LOGGER.info("消息被消费成功"); LOGGER.info("process orderId:{}",orderId); } }
-
spring boot集成rabbitmq完成
2springboot集成rabbitmq应用场景
2.1用户下单超时未支付自动取消订单
订单取消功能:
一般情况下用户下单后,如果在120分钟以内还不支付,则此订单将会默认取消。
- 可以用定时任务每隔1分钟去扫描判断有没有超时的订单如果有,则直接取消订单。
- 第二种情况可以利用rabbitmq延时队列实现,用户下单那一时刻,则直接调用单个订单超时自动取消接口
2.2代码实现
2.2.1http请求服务层
@RestController @RequestMapping("api") public class OrderController { @Autowired private CancelOrderSender orderSender; @RequestMapping(value = "/cancelOrder",method = RequestMethod.POST) @ResponseBody public CommonResult cancelOrder(){ //1分钟消息被消费 //单位毫秒 orderSender.sendMessage(1L,60000); return CommonResult.success(null); } }
2.2.2业务逻辑服务层
@Component public class CancelOrderSender { private static Logger LOGGER = LoggerFactory.getLogger(CancelOrderSender.class); @Autowired private AmqpTemplate amqpTemplate; public void sendMessage(Long orderId,final long delayTimes){ //给延迟队列发送消息 amqpTemplate.convertAndSend(QueueEnum.QUEUE_TTL_ORDER_CANCEL.getExchange(), QueueEnum.QUEUE_TTL_ORDER_CANCEL.getRouteKey(), orderId, new MessagePostProcessor() { @Override public Message postProcessMessage(Message message) throws AmqpException { //给消息设置延迟毫秒值 message.getMessageProperties().setExpiration(String.valueOf(delayTimes)); return message; } }); LOGGER.info("send orderId:{}",orderId); } }
2.2.3代码测试
-
postman测试 测试结果
用户下单成功消息延迟1分钟被消费
3总结
- 技术方向springboot如何整合rabbitmq实现消息队列
- 业务方向用户下单超时未支付订单如何处理,以及自己的实现思路
4个人说明
经验是由一点一点积累的,思维也是由一天一天训练出来的。