快捷搜索:

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. 可以用定时任务每隔1分钟去扫描判断有没有超时的订单如果有,则直接取消订单。
  2. 第二种情况可以利用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总结

  1. 技术方向springboot如何整合rabbitmq实现消息队列
  2. 业务方向用户下单超时未支付订单如何处理,以及自己的实现思路

 

4个人说明

经验是由一点一点积累的,思维也是由一天一天训练出来的。

 

经验分享 程序员 职场和发展