网站建设网络推广seo,企业推广的成功在于他们发现,网站优化seo是什么意思,电商网站开发哪里好RabbitMQ使用延迟消息
1.什么情况下使用延迟消息
延迟消息适用于需要在一段时间后执行某些操作的场景#xff0c;常见的有以下几类#xff1a;
1.1. 订单超时取消#xff08;未支付自动取消#xff09;
场景#xff1a; 用户下单后#xff0c;如果 30 分钟内未付款常见的有以下几类
1.1. 订单超时取消未支付自动取消
场景 用户下单后如果 30 分钟内未付款系统需要自动取消订单。
实现方式 订单创建时发送延迟消息30 分钟后检查订单状态。 若订单仍未支付则自动取消并释放库存。
2.支付后延迟发货
场景 某些商品需要延迟发货例如 7 天无理由退款期间不立即发货等待用户是否申请退款。
实现方式 用户付款后发送延迟消息7 天后检查订单状态。 如果用户未申请退款则发货否则取消发货。
3. 限时活动抢购、秒杀等 ⏳
场景 某些促销活动如秒杀、限时抢购在特定时间开始或结束。
实现方式 活动开始前发送延迟消息定时开放库存。 活动结束前发送延迟消息下架商品停止抢购。 2.延迟消息实现
这里使用第一种情况实现(下单未付款特定时间内取消订单恢复库存)
1.下载RabbitMQ的延迟消息插件地址
Releases · rabbitmq/rabbitmq-delayed-message-exchange
下载完将插件在docker中添加到RabbitMQ的plugins中然后docker restart rabbitmq重启RabbitMQ
2.在交换机中添加新的交换机类型中多了一个x-delayed-message,这表示延迟消息插件安装成功
3.使用注解声明延迟消息交换机
定义远驰消息交换机名字、延迟消息队列和routingkey
public interface MqConstants {String DELAY_EXCHANGE_NAME trade.delay.direct;String DELAY_ORDER_QUEUE_NAME trade.delay.order.queue;String DELAY_ORDER_KEY delay.order.query;
} /*** 监听延迟队列如果订单下单未支付则取消订单恢复库存* param orderId*/RabbitListener(bindings QueueBinding(value Queue(name MqConstants.DELAY_ORDER_QUEUE_NAME), //延迟队列名exchange Exchange(name MqConstants.DELAY_EXCHANGE_NAME, delayed true), //延迟交换机名key MqConstants.DELAY_ORDER_KEY //routingkey))public void listenOrderDelayMessage(Long orderId){// 1.查询订单Order order orderService.getById(orderId);// 2.检测订单状态判断是否已支付if(order null || order.getStatus() ! 1){// 订单不存在或者已经支付return;}// 3.未支付需要查询支付流水状态PayOrderDTO payOrder payClient.queryPayOrderByBizOrderNo(orderId);// 4.判断是否支付if(payOrder ! null payOrder.getStatus() 3){// 4.1.已支付标记订单状态为已支付orderService.markOrderPaySuccess(orderId);}else{// TODO 4.2.未支付取消订单回复库存System.out.println(订单未支付取消订单回复库存);
// orderService.cancelOrder(orderId);}}
}
4.发送消息
用户下单完毕后想延迟消息队列发送消息
//下单完毕后/*** TODO:发送延迟消息,查询10秒后订单的状态如果没支付则取消订单恢复库存*/rabbitTemplate.convertAndSend(MqConstants.DELAY_EXCHANGE_NAME,MqConstants.DELAY_ORDER_KEY,order.getId(),message - {message.getMessageProperties().setDelay(1000 * 10);//延迟时间10sreturn message;});
通过设置交换机名字和routingkey可以绑定到延迟消息队列
这里设置延迟时间为10s方便测试下单10s后会发送消息到延迟消息交换机然后去判断用户是否支付如果未支付则取消订单恢复库存
3.实践
发送下单请求 控制台可以看到下单到消费消息中间间隔十秒钟表明我们设置的延迟消息成功