From bca95d683d347aec803c1764e3c0022162e5ebfe Mon Sep 17 00:00:00 2001 From: chen-xin-zhi <3588068430@qq.com> Date: Tue, 1 Jul 2025 07:18:02 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0rabbitmq=E5=BB=B6=E8=BF=9F?= =?UTF-8?q?=E9=98=9F=E5=88=97=E6=8F=92=E4=BB=B6=E5=A4=84=E7=90=86=E8=AE=A2?= =?UTF-8?q?=E5=8D=95=E8=B6=85=E6=97=B6=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../promotion/constant/MqConstant.java | 17 +++++ .../course/CourseOrderController.java | 2 + .../listener/OrderStatusListener.java | 66 +++++++++++++++++++ .../service/course/CourseOrderService.java | 6 ++ .../course/impl/CourseOrderServiceImpl.java | 30 +++++++++ src/main/resources/application.yml | 2 +- 6 files changed, 122 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/greenorange/promotion/constant/MqConstant.java create mode 100644 src/main/java/com/greenorange/promotion/listener/OrderStatusListener.java diff --git a/src/main/java/com/greenorange/promotion/constant/MqConstant.java b/src/main/java/com/greenorange/promotion/constant/MqConstant.java new file mode 100644 index 0000000..1d4ed0b --- /dev/null +++ b/src/main/java/com/greenorange/promotion/constant/MqConstant.java @@ -0,0 +1,17 @@ +package com.greenorange.promotion.constant; + +import java.util.List; + +public interface MqConstant { + + List DELAY_MILLIS = List.of(10000L, 10000L, 10000L, 15000L, 15000L, 30000L, 30000L, 60000L, 60000L, 120000L, 120000L, 120000L, 300000L); + +// List DELAY_MILLIS = List.of(10000L, 10000L, 10000L, 15000L, 15000L); + + String DELAY_EXCHANGE = "delay.topic"; + + String DELAY_ORDER_QUEUE = "order.delay.queue"; + + String DELAY_ORDER_ROUTING_KEY = "order.key"; + +} diff --git a/src/main/java/com/greenorange/promotion/controller/course/CourseOrderController.java b/src/main/java/com/greenorange/promotion/controller/course/CourseOrderController.java index df6f711..33d89b1 100644 --- a/src/main/java/com/greenorange/promotion/controller/course/CourseOrderController.java +++ b/src/main/java/com/greenorange/promotion/controller/course/CourseOrderController.java @@ -78,6 +78,8 @@ public class CourseOrderController { courseOrder.setTotalAmount(course.getDiscountPrice()); courseOrder.setUserId(userId); courseOrderService.save(courseOrder); + // 向消息队列中发送订单创建的消息 + courseOrderService.sendCreateOrderMessage(courseOrder.getId()); return ResultUtils.success(courseOrder.getId()); } diff --git a/src/main/java/com/greenorange/promotion/listener/OrderStatusListener.java b/src/main/java/com/greenorange/promotion/listener/OrderStatusListener.java new file mode 100644 index 0000000..6223f56 --- /dev/null +++ b/src/main/java/com/greenorange/promotion/listener/OrderStatusListener.java @@ -0,0 +1,66 @@ +package com.greenorange.promotion.listener; + +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.greenorange.promotion.constant.MqConstant; +import com.greenorange.promotion.constant.OrderStatusConstant; +import com.greenorange.promotion.model.entity.CourseOrder; +import com.greenorange.promotion.service.course.CourseOrderService; +import com.greenorange.promotion.utils.MultiDelayMessage; +import jakarta.annotation.Resource; +import org.springframework.amqp.rabbit.annotation.Exchange; +import org.springframework.amqp.rabbit.annotation.Queue; +import org.springframework.amqp.rabbit.annotation.QueueBinding; +import org.springframework.amqp.rabbit.annotation.RabbitListener; +import org.springframework.amqp.rabbit.core.RabbitTemplate; +import org.springframework.stereotype.Component; + +@Component +public class OrderStatusListener { + + + @Resource + private CourseOrderService courseOrderService; + + + @Resource + private RabbitTemplate rabbitTemplate; + + + + @RabbitListener(bindings = @QueueBinding( + value = @Queue(MqConstant.DELAY_ORDER_QUEUE), + exchange = @Exchange(name = MqConstant.DELAY_EXCHANGE, delayed = "true"), + key = MqConstant.DELAY_ORDER_ROUTING_KEY + )) + public void listenDelayMessage(MultiDelayMessage msg) { + System.out.println("\n\n\n\n\nOrderStatusListener.listenerDelayMessage msg-------------------------------->:" + msg); + // 1.获取消息中的订单id + Long orderId = msg.getData(); + // 2.查询订单,判断状态是否为待支付 + CourseOrder courseOrder = courseOrderService.getById(orderId); + // 订单不存在或者订单已经支付 + if (courseOrder == null || !courseOrder.getOrderStatus().equals(OrderStatusConstant.PENDING)) { + return ; + } + // 3.订单未支付,判断是否还有剩余延时时间 + if (msg.hasNextDelay()) { + // 有延迟时间,需要重发延迟消息,先获取延迟时间的int值 + // 发送延时消息 + Long delayValue = msg.removeNextDelay(); + rabbitTemplate.convertAndSend(MqConstant.DELAY_EXCHANGE, + MqConstant.DELAY_ORDER_ROUTING_KEY, msg, message -> { + // 添加延迟消息属性 + message.getMessageProperties().setDelayLong(delayValue); + return message; + }); + return ; + } + // 没有剩余延时时间,说明订单超时未支付,需取消订单 + LambdaUpdateWrapper lambdaUpdateWrapper = new LambdaUpdateWrapper<>(); + lambdaUpdateWrapper.eq(CourseOrder::getId, orderId) + .set(CourseOrder::getOrderStatus, OrderStatusConstant.CLOSED); + courseOrderService.updateById(courseOrder); + } + + +} diff --git a/src/main/java/com/greenorange/promotion/service/course/CourseOrderService.java b/src/main/java/com/greenorange/promotion/service/course/CourseOrderService.java index 405f69d..3980d8a 100644 --- a/src/main/java/com/greenorange/promotion/service/course/CourseOrderService.java +++ b/src/main/java/com/greenorange/promotion/service/course/CourseOrderService.java @@ -17,4 +17,10 @@ public interface CourseOrderService extends IService { * 获取查询条件 */ QueryWrapper getQueryWrapper(CourseOrderQueryRequest courseOrderQueryRequest); + + + /** + * 向消息队列中发送订单创建的消息 + */ + void sendCreateOrderMessage(Long orderId); } diff --git a/src/main/java/com/greenorange/promotion/service/course/impl/CourseOrderServiceImpl.java b/src/main/java/com/greenorange/promotion/service/course/impl/CourseOrderServiceImpl.java index ddb9962..5d3e3b2 100644 --- a/src/main/java/com/greenorange/promotion/service/course/impl/CourseOrderServiceImpl.java +++ b/src/main/java/com/greenorange/promotion/service/course/impl/CourseOrderServiceImpl.java @@ -3,14 +3,21 @@ package com.greenorange.promotion.service.course.impl; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.greenorange.promotion.constant.CommonConstant; +import com.greenorange.promotion.constant.MqConstant; import com.greenorange.promotion.model.dto.courseOrder.CourseOrderQueryRequest; import com.greenorange.promotion.model.entity.CourseOrder; import com.greenorange.promotion.service.course.CourseOrderService; import com.greenorange.promotion.mapper.CourseOrderMapper; +import com.greenorange.promotion.utils.MultiDelayMessage; import com.greenorange.promotion.utils.SqlUtils; +import jakarta.annotation.Resource; import org.apache.commons.lang3.StringUtils; +import org.springframework.amqp.rabbit.core.RabbitTemplate; import org.springframework.stereotype.Service; +import java.util.ArrayList; +import java.util.List; + /** * @author 35880 * @description 针对表【course_order(课程订单表)】的数据库操作Service实现 @@ -21,6 +28,10 @@ public class CourseOrderServiceImpl extends ServiceImpl newDelayMillis = new ArrayList<>(MqConstant.DELAY_MILLIS); + // 延迟检查订单状态信息 + MultiDelayMessage msg = new MultiDelayMessage<>(orderId, newDelayMillis); + long delayValue = msg.removeNextDelay(); + rabbitTemplate.convertAndSend(MqConstant.DELAY_EXCHANGE, + MqConstant.DELAY_ORDER_ROUTING_KEY, msg, message -> { + // 添加延迟消息属性 + message.getMessageProperties().setDelayLong(delayValue); + return message; + }); + } } diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index a17ec4c..ad9a171 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -1,4 +1,4 @@ spring: profiles: - active: test + active: dev