diff --git a/src/main/java/com/cultural/heritage/listener/CouponStatusListener.java b/src/main/java/com/cultural/heritage/listener/CouponStatusListener.java index a699288..fc4a1b5 100644 --- a/src/main/java/com/cultural/heritage/listener/CouponStatusListener.java +++ b/src/main/java/com/cultural/heritage/listener/CouponStatusListener.java @@ -12,6 +12,7 @@ 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 @@ -22,6 +23,10 @@ public class CouponStatusListener { private CouponService couponService; + @Resource + private RabbitTemplate rabbitTemplate; + + @RabbitListener(bindings = @QueueBinding( value = @Queue(MqConstant.DELAY_COUPON_QUEUE), @@ -43,6 +48,19 @@ public class CouponStatusListener { if (!sourceCoupon.getEndTime().equals(targetCoupon.getEndTime())) { return ; } + // 3.优惠券未到截止日期,判断是否还有剩余延时时间 + if (msg.hasNextDelay()) { + // 有延迟时间,需要重发延迟消息,先获取延迟时间的int值 + // 发送延时消息 + int delayValue = msg.removeNextDelay().intValue(); + rabbitTemplate.convertAndSend(MqConstant.DELAY_EXCHANGE, + MqConstant.DELAY_ORDER_ROUTING_KEY, msg, message -> { + // 添加延迟消息属性 + message.getMessageProperties().setDelay(delayValue * 1000); + return message; + }); + return ; + } // 4.更新优惠券状态 UpdateWrapper updateWrapper = new UpdateWrapper<>(); updateWrapper.eq("id", couponId).set("status", "已过期"); diff --git a/src/main/java/com/cultural/heritage/listener/UserCouponStatusListener.java b/src/main/java/com/cultural/heritage/listener/UserCouponStatusListener.java index 486db7a..11ae853 100644 --- a/src/main/java/com/cultural/heritage/listener/UserCouponStatusListener.java +++ b/src/main/java/com/cultural/heritage/listener/UserCouponStatusListener.java @@ -14,6 +14,7 @@ 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; @@ -24,6 +25,10 @@ public class UserCouponStatusListener { private UserCouponService userCouponService; + @Resource + private RabbitTemplate rabbitTemplate; + + @RabbitListener(bindings = @QueueBinding( value = @Queue(MqConstant.DELAY_USER_COUPON_QUEUE), exchange = @Exchange(name = MqConstant.DELAY_EXCHANGE, delayed = "true"), @@ -32,7 +37,21 @@ public class UserCouponStatusListener { public void listenDelayMessage(MultiDelayMessage msg) { System.out.println("\n\n\n\n\nUserCouponStatusListener.listenerDelayMessage msg-------------------------------->:" + msg); - // 1.获取消用户优惠券id + // 3.我的优惠券未到截止日期,判断是否还有剩余延时时间 + if (msg.hasNextDelay()) { + // 有延迟时间,需要重发延迟消息,先获取延迟时间的int值 + // 发送延时消息 + int delayValue = msg.removeNextDelay().intValue(); + rabbitTemplate.convertAndSend(MqConstant.DELAY_EXCHANGE, + MqConstant.DELAY_ORDER_ROUTING_KEY, msg, message -> { + // 添加延迟消息属性 + message.getMessageProperties().setDelay(delayValue * 1000); + return message; + }); + return ; + } + + // 1.获取用户优惠券id Long userCouponId = msg.getData(); // 2.获取优惠券信息 UserCoupon userCoupon = userCouponService.getById(userCouponId); diff --git a/src/main/java/com/cultural/heritage/service/good/impl/CouponServiceImpl.java b/src/main/java/com/cultural/heritage/service/good/impl/CouponServiceImpl.java index 55e1970..175fbea 100644 --- a/src/main/java/com/cultural/heritage/service/good/impl/CouponServiceImpl.java +++ b/src/main/java/com/cultural/heritage/service/good/impl/CouponServiceImpl.java @@ -16,6 +16,7 @@ import com.cultural.heritage.model.entity.UserCoupon; import com.cultural.heritage.service.good.CouponService; import com.cultural.heritage.utils.MultiDelayMessage; import com.cultural.heritage.utils.SqlUtils; +import com.cultural.heritage.utils.TimeSplitterUtils; import jakarta.annotation.Resource; import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.StringUtils; @@ -24,6 +25,7 @@ import org.springframework.stereotype.Service; import java.math.BigDecimal; import java.util.Date; +import java.util.List; @Service public class CouponServiceImpl extends ServiceImpl implements CouponService { @@ -110,16 +112,18 @@ public class CouponServiceImpl extends ServiceImpl impleme */ @Override public void sendCouponCreateMessage(Coupon coupon) { + //计算优惠券截止日期和当前的时间差 + DateTime now = new DateTime(); + DateTime end = DateUtil.parse(coupon.getEndTime()); + long seconds = DateUtil.between(now, end, DateUnit.SECOND); + List splitTimeList = TimeSplitterUtils.splitTime(seconds); // 延迟检查优惠券是否过期 - MultiDelayMessage msg = new MultiDelayMessage<>(coupon); + MultiDelayMessage msg = new MultiDelayMessage<>(coupon, splitTimeList); + int delayValue = msg.removeNextDelay().intValue(); rabbitTemplate.convertAndSend(MqConstant.DELAY_EXCHANGE, MqConstant.DELAY_COUPON_ROUTING_KEY, msg, message -> { - //计算优惠券截止日期和当前的时间差 - DateTime now = new DateTime(); - DateTime end = DateUtil.parse(coupon.getEndTime()); - long seconds = DateUtil.between(now, end, DateUnit.SECOND); // 添加延迟消息属性 - message.getMessageProperties().setDelay((int) (seconds * 1000)); + message.getMessageProperties().setDelay(delayValue * 1000); return message; }); } @@ -132,16 +136,18 @@ public class CouponServiceImpl extends ServiceImpl impleme */ @Override public void sendUserCouponCreateMessage(UserCoupon userCoupon, Coupon coupon) { + //计算优惠券截止日期和当前的时间差 + DateTime now = new DateTime(); + DateTime end = DateUtil.parse(coupon.getEndTime()); + long seconds = DateUtil.between(now, end, DateUnit.SECOND); + List splitTimeList = TimeSplitterUtils.splitTime(seconds); // 延迟检查优惠券是否过期 - MultiDelayMessage msg = new MultiDelayMessage<>(userCoupon.getId()); + MultiDelayMessage msg = new MultiDelayMessage<>(userCoupon.getId(), splitTimeList); + int delayValue = msg.removeNextDelay().intValue(); rabbitTemplate.convertAndSend(MqConstant.DELAY_EXCHANGE, MqConstant.DELAY_USER_COUPON_ROUTING_KEY, msg, message -> { - //计算优惠券截止日期和当前的时间差 - DateTime now = new DateTime(); - DateTime end = DateUtil.parse(coupon.getEndTime()); - long seconds = DateUtil.between(now, end, DateUnit.SECOND); // 添加延迟消息属性 - message.getMessageProperties().setDelay((int) (seconds * 1000)); + message.getMessageProperties().setDelay(delayValue * 1000); return message; }); } diff --git a/src/main/java/com/cultural/heritage/utils/TimeSplitterUtils.java b/src/main/java/com/cultural/heritage/utils/TimeSplitterUtils.java new file mode 100644 index 0000000..dcd234d --- /dev/null +++ b/src/main/java/com/cultural/heritage/utils/TimeSplitterUtils.java @@ -0,0 +1,24 @@ +package com.cultural.heritage.utils; + +import java.util.ArrayList; +import java.util.List; + +public class TimeSplitterUtils { + + public static List splitTime(long totalSeconds) { + List timeIntervals = new ArrayList<>(); + long oneDayInSeconds = 86400; // 1天的秒数 + + // 拆分完整的天数 + while (totalSeconds >= oneDayInSeconds) { + timeIntervals.add(oneDayInSeconds); // 每天加一个完整的时间段 + totalSeconds -= oneDayInSeconds; // 减去已拆分的天数 + } + // 如果剩余时间大于0,则加上剩余的时间 + if (totalSeconds > 0) { + timeIntervals.add(totalSeconds); // 剩余时间 + } + return timeIntervals; + } + +}