From f44e4d609e7efaed9eac545137970b1e334f8106 Mon Sep 17 00:00:00 2001 From: mitao <2763622819@qq.com> Date: 星期六, 21 九月 2024 09:01:36 +0800 Subject: [PATCH] 修改bug --- ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/async/AsyncMethodService.java | 95 +++++++++++++++++++++++++---------------------- 1 files changed, 50 insertions(+), 45 deletions(-) diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/async/AsyncMethodService.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/async/AsyncMethodService.java index f685434..f1b1ae1 100644 --- a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/async/AsyncMethodService.java +++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/async/AsyncMethodService.java @@ -1,14 +1,16 @@ package com.ruoyi.goods.service.async; +import com.ruoyi.common.core.constant.SecurityConstants; import com.ruoyi.common.core.utils.StringUtils; import com.ruoyi.common.redis.service.RedisService; -import com.ruoyi.goods.domain.GoodsGroupPurchase; import com.ruoyi.system.api.constants.DelayTaskEnum; import com.ruoyi.system.api.domain.DelayTask; +import com.ruoyi.system.api.domain.GoodsGroupPurchase; import com.ruoyi.system.api.domain.GoodsSeckill; import com.ruoyi.system.api.feignClient.SysUserClient; import java.time.Duration; import java.time.LocalDateTime; +import java.util.List; import java.util.concurrent.TimeUnit; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -30,64 +32,69 @@ @Async @Transactional(rollbackFor = Exception.class) - public void seckillScheduleTask(GoodsSeckill goodsSeckill) { - LocalDateTime startTime = goodsSeckill.getStartTime(); - LocalDateTime endTime = goodsSeckill.getEndTime(); - //秒杀在一小时内开始 - if (isWithinOneHour(startTime)) { - Long id = goodsSeckill.getId(); - //秒杀已经开始 - if (LocalDateTime.now().isAfter(startTime)) { - handleStartDelayTask(id, DelayTaskEnum.SECKILL_START_TASK, startTime, 3L); - } else { - Duration duration = Duration.between(LocalDateTime.now(), startTime); - handleStartDelayTask(id, DelayTaskEnum.SECKILL_START_TASK, startTime, - duration.getSeconds()); + public void seckillScheduleTask(List<GoodsSeckill> goodsSeckillList) { + for (GoodsSeckill goodsSeckill : goodsSeckillList) { + LocalDateTime startTime = goodsSeckill.getStartTime(); + LocalDateTime endTime = goodsSeckill.getEndTime(); + // 秒杀在一小时内开始 + if (isWithinOneHour(startTime)) { + Long id = goodsSeckill.getId(); + // 秒杀已经开始 + if (LocalDateTime.now().isAfter(startTime)) { + handleStartDelayTask(id, DelayTaskEnum.SECKILL_START_TASK, startTime, 3L); + log.info(">>>>>>>>>>>>>>>>>>>>秒杀商品:{} 开始秒杀<<<<<<<<<<<<<<<<<<<<", id); + } else { + Duration duration = Duration.between(LocalDateTime.now(), startTime); + handleStartDelayTask(id, DelayTaskEnum.SECKILL_START_TASK, startTime, + duration.getSeconds()); + } + // 秒杀结束延时任务 + handleEndDelayTask(id, DelayTaskEnum.SECKILL_END_TASK, endTime); } - log.info(">>>>>>>>>>>>>>>>>>>>秒杀商品:{} 开始秒杀<<<<<<<<<<<<<<<<<<<<", id); - //秒杀结束延时任务 - handleEndDelayTask(id, DelayTaskEnum.SECKILL_END_TASK, endTime); - } } @Async @Transactional(rollbackFor = Exception.class) - public void groupPurchaseScheduleTask(GoodsGroupPurchase groupPurchase) { - LocalDateTime startTime = groupPurchase.getStartTime(); - LocalDateTime endTime = groupPurchase.getEndTime(); - //秒杀在一小时内开始 - if (isWithinOneHour(startTime)) { - Long id = groupPurchase.getId(); - //秒杀已经开始,三秒后执行 - if (LocalDateTime.now().isAfter(startTime)) { - handleStartDelayTask(id, DelayTaskEnum.GROUP_PURCHASES_START_TASK, startTime, 3L); - } else { - Duration duration = Duration.between(LocalDateTime.now(), startTime); - handleStartDelayTask(id, DelayTaskEnum.GROUP_PURCHASES_START_TASK, startTime, - duration.getSeconds()); + public void groupPurchaseScheduleTask(List<GoodsGroupPurchase> groupPurchaseList) { + for (GoodsGroupPurchase goodsGroupPurchase : groupPurchaseList) { + LocalDateTime startTime = goodsGroupPurchase.getStartTime(); + LocalDateTime endTime = goodsGroupPurchase.getEndTime(); + // 团购在一小时内开始 + if (isWithinOneHour(startTime)) { + Long id = goodsGroupPurchase.getId(); + // 团购已经开始,三秒后执行 + if (LocalDateTime.now().isAfter(startTime)) { + handleStartDelayTask(id, DelayTaskEnum.GROUP_PURCHASES_START_TASK, startTime, + 3L); + } else { + Duration duration = Duration.between(LocalDateTime.now(), startTime); + handleStartDelayTask(id, DelayTaskEnum.GROUP_PURCHASES_START_TASK, startTime, + duration.getSeconds()); + } + // 团购结束延时任务 + handleEndDelayTask(id, DelayTaskEnum.GROUP_PURCHASES_END_TASK, endTime); } - //秒杀结束延时任务 - handleEndDelayTask(id, DelayTaskEnum.GROUP_PURCHASES_END_TASK, endTime); } } - + private boolean isWithinOneHour(LocalDateTime startTime) { - LocalDateTime checkTime = LocalDateTime.now().plusHours(1); + LocalDateTime checkTime = LocalDateTime.now().plusMinutes(61); return checkTime.isAfter(startTime); } private void handleEndDelayTask(Long id, DelayTaskEnum delayTaskEnum, LocalDateTime endTime) { String endTaskKey = delayTaskEnum.getCode() + "-" + id; DelayTask endDelayTask = sysUserClient.getDelayTask( - endTaskKey).getData(); + endTaskKey, SecurityConstants.INNER).getData(); // 如果延时任务为空,创建延时任务控制活动定时开始和结束 Duration duration = Duration.between(LocalDateTime.now(), endTime); if (StringUtils.isNull(endDelayTask)) { createEndDelayTask(endTime, endTaskKey, duration); } else { if (!endDelayTask.getExecuteTime().isEqual(endTime)) { - sysUserClient.deleteDelayTask(endTaskKey); + sysUserClient.deleteDelayTask(endTaskKey, + SecurityConstants.INNER); redisService.deleteObject(endTaskKey); createEndDelayTask(endTime, endTaskKey, duration); } @@ -106,18 +113,15 @@ endDelayTask.setCreateTime(LocalDateTime.now()); endDelayTask.setExecuteTime(endTime); endDelayTask.setRedisKey(seckillEndTaskKey); - sysUserClient.addDelayTask(endDelayTask); + sysUserClient.addDelayTask(endDelayTask, SecurityConstants.INNER); } private void handleStartDelayTask(Long id, DelayTaskEnum delayTaskEnum, LocalDateTime startTime, Long timeout) { String startTaskKey = delayTaskEnum.getCode() + "-" + id; - redisService.setCacheObject( - startTaskKey, - startTime, timeout, TimeUnit.SECONDS); //查询延时任务 DelayTask startDelayTask = sysUserClient.getDelayTask( - startTaskKey).getData(); + startTaskKey, SecurityConstants.INNER).getData(); if (StringUtils.isNull(startDelayTask)) { startDelayTask = new DelayTask(); startDelayTask.setDelFlag(0); @@ -125,11 +129,11 @@ startDelayTask.setExecuteTime(LocalDateTime.now().plusSeconds(timeout)); startDelayTask.setRedisKey( startTaskKey); - sysUserClient.addDelayTask(startDelayTask); + sysUserClient.addDelayTask(startDelayTask, SecurityConstants.INNER); } else { if (!startDelayTask.getExecuteTime().isEqual(startTime)) { sysUserClient.deleteDelayTask( - startTaskKey); + startTaskKey, SecurityConstants.INNER); redisService.deleteObject( startTaskKey); startDelayTask.setDelFlag(0); @@ -137,9 +141,10 @@ startDelayTask.setExecuteTime(LocalDateTime.now().plusSeconds(timeout)); startDelayTask.setRedisKey( startTaskKey); - sysUserClient.addDelayTask(startDelayTask); + } } + redisService.setCacheObject(startTaskKey, startTime, timeout, TimeUnit.SECONDS); log.info(">>>>>>>>>>>>>>>>>>>>延时任务{}执行了<<<<<<<<<<<<<<<<<<<<", startTaskKey); } } -- Gitblit v1.7.1