From 24dc3cab15f21d4ebcd25aea20d45ede98a8a1ce Mon Sep 17 00:00:00 2001
From: mitao <2763622819@qq.com>
Date: 星期五, 24 五月 2024 15:56:42 +0800
Subject: [PATCH] 提交秒杀/团购定时开始结束功能实现

---
 ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/listener/RedisListener.java                   |   10 
 ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/DelayTask.java                     |    4 
 ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/config/BaseAsyncConfigurer.java      |   54 +++++++
 ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/GoodsGroupPurchaseServiceImpl.java |    1 
 ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/async/AsyncMethodService.java           |  142 ++++++++++++++++++++
 ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/GoodsSeckillServiceImpl.java       |  124 ----------------
 ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/task/GoodsScheduler.java                        |   54 +++++++
 7 files changed, 264 insertions(+), 125 deletions(-)

diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/DelayTask.java b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/DelayTask.java
index c113e83..a8a10d3 100644
--- a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/DelayTask.java
+++ b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/DelayTask.java
@@ -44,8 +44,8 @@
     /**
      * 执行时间
      */
-    @TableField("end_time")
-    private LocalDateTime endTime;
+    @TableField("execute_time")
+    private LocalDateTime executeTime;
 
     @TableField("create_time")
     private LocalDateTime createTime;
diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/config/BaseAsyncConfigurer.java b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/config/BaseAsyncConfigurer.java
new file mode 100644
index 0000000..3263e0f
--- /dev/null
+++ b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/config/BaseAsyncConfigurer.java
@@ -0,0 +1,54 @@
+package com.ruoyi.common.core.config;
+
+import java.lang.reflect.Method;
+import java.util.concurrent.Executor;
+import java.util.concurrent.ThreadPoolExecutor;
+import org.springframework.aop.interceptor.AsyncUncaughtExceptionHandler;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.scheduling.annotation.AsyncConfigurer;
+import org.springframework.scheduling.annotation.EnableAsync;
+import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
+
+@Configuration
+@EnableAsync
+public class BaseAsyncConfigurer implements AsyncConfigurer {
+
+    @Bean("AsyncExecutor")
+    public ThreadPoolTaskExecutor executor() {
+        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
+        int corePoolSize = 10;
+        executor.setCorePoolSize(corePoolSize);
+        int maxPoolSize = 50;
+        executor.setMaxPoolSize(maxPoolSize);
+        int queueCapacity = 10;
+        executor.setQueueCapacity(queueCapacity);
+        executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
+        String threadNamePrefix = "AsyncExecutor-";
+        executor.setThreadNamePrefix(threadNamePrefix);
+        executor.setWaitForTasksToCompleteOnShutdown(true);
+        // 使用自定义的跨线程的请求级别线程工厂类19
+        int awaitTerminationSeconds = 5;
+        executor.setAwaitTerminationSeconds(awaitTerminationSeconds);
+        executor.initialize();
+        return executor;
+    }
+
+    @Override
+    public Executor getAsyncExecutor() {
+        return executor();
+    }
+
+    /*异步任务中异常处理*/
+    @Override
+    public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
+        return (Throwable ex, Method method, Object... params) -> {
+            //todo 异步方法异常处理
+            System.out.println("class#method: " + method.getDeclaringClass().getName() + "#"
+                    + method.getName());
+            System.out.println("type        : " + ex.getClass().getName());
+            System.out.println("exception   : " + ex.getMessage());
+        };
+    }
+
+}
\ No newline at end of file
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
new file mode 100644
index 0000000..b07f229
--- /dev/null
+++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/async/AsyncMethodService.java
@@ -0,0 +1,142 @@
+package com.ruoyi.goods.service.async;
+
+import com.ruoyi.common.core.utils.StringUtils;
+import com.ruoyi.common.redis.service.RedisService;
+import com.ruoyi.goods.domain.GoodsGroupPurchase;
+import com.ruoyi.goods.domain.GoodsSeckill;
+import com.ruoyi.system.api.constants.DelayTaskEnum;
+import com.ruoyi.system.api.domain.DelayTask;
+import com.ruoyi.system.api.feignClient.SysUserClient;
+import java.time.Duration;
+import java.time.LocalDateTime;
+import java.util.concurrent.TimeUnit;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.scheduling.annotation.Async;
+import org.springframework.stereotype.Component;
+
+/**
+ * @author mitao
+ * @date 2024/5/24
+ */
+@Component
+@Slf4j
+@RequiredArgsConstructor
+public class AsyncMethodService {
+
+    private final RedisService redisService;
+    private final SysUserClient sysUserClient;
+
+    @Async
+    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());
+            }
+            log.info(">>>>>>>>>>>>>>>>>>>>秒杀商品:{} 开始秒杀<<<<<<<<<<<<<<<<<<<<", id);
+            //秒杀结束延时任务
+            handleEndDelayTask(id, DelayTaskEnum.SECKILL_END_TASK, endTime);
+
+        }
+    }
+
+    @Async
+    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());
+            }
+            //秒杀结束延时任务
+            handleEndDelayTask(id, DelayTaskEnum.GROUP_PURCHASES_END_TASK, endTime);
+        }
+    }
+
+    private boolean isWithinOneHour(LocalDateTime startTime) {
+        LocalDateTime checkTime = LocalDateTime.now().plusHours(1);
+        return checkTime.isAfter(startTime);
+    }
+
+    private void handleEndDelayTask(Long id, DelayTaskEnum delayTaskEnum, LocalDateTime endTime) {
+        String endTaskKey = delayTaskEnum.getCode() + "-" + id;
+        DelayTask endDelayTask = sysUserClient.getDelayTask(
+                endTaskKey).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);
+                redisService.deleteObject(endTaskKey);
+                createEndDelayTask(endTime, endTaskKey, duration);
+            }
+        }
+        log.info(">>>>>>>>>>>>>>>>>>>>延时任务{}执行了<<<<<<<<<<<<<<<<<<<<", endTaskKey);
+    }
+
+    private void createEndDelayTask(LocalDateTime endTime, String seckillEndTaskKey,
+            Duration duration) {
+        DelayTask endDelayTask;
+        redisService.setCacheObject(
+                seckillEndTaskKey,
+                endTime, duration.getSeconds(), TimeUnit.SECONDS);
+        endDelayTask = new DelayTask();
+        endDelayTask.setDelFlag(0);
+        endDelayTask.setCreateTime(LocalDateTime.now());
+        endDelayTask.setExecuteTime(endTime);
+        endDelayTask.setRedisKey(seckillEndTaskKey);
+        sysUserClient.addDelayTask(endDelayTask);
+    }
+
+    private void handleStartDelayTask(Long id, DelayTaskEnum delayTaskEnum, LocalDateTime startTime,
+            Long timeout) {
+        String startTaskKey = delayTaskEnum.getCode() + "-" + id;
+        //查询延时任务
+        DelayTask startDelayTask = sysUserClient.getDelayTask(
+                startTaskKey).getData();
+        redisService.setCacheObject(
+                startTaskKey,
+                startTime, timeout, TimeUnit.SECONDS);
+        if (StringUtils.isNull(startDelayTask)) {
+            startDelayTask = new DelayTask();
+            startDelayTask.setDelFlag(0);
+            startDelayTask.setCreateTime(LocalDateTime.now());
+            startDelayTask.setExecuteTime(LocalDateTime.now().plusSeconds(timeout));
+            startDelayTask.setRedisKey(
+                    startTaskKey);
+            sysUserClient.addDelayTask(startDelayTask);
+        } else {
+            if (!startDelayTask.getExecuteTime().isEqual(startTime)) {
+                sysUserClient.deleteDelayTask(
+                        startTaskKey);
+                redisService.deleteObject(
+                        startTaskKey);
+                startDelayTask.setDelFlag(0);
+                startDelayTask.setCreateTime(LocalDateTime.now());
+                startDelayTask.setExecuteTime(LocalDateTime.now().plusSeconds(timeout));
+                startDelayTask.setRedisKey(
+                        startTaskKey);
+                sysUserClient.addDelayTask(startDelayTask);
+            }
+        }
+        log.info(">>>>>>>>>>>>>>>>>>>>延时任务{}执行了<<<<<<<<<<<<<<<<<<<<", startTaskKey);
+    }
+}
diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/GoodsGroupPurchaseServiceImpl.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/GoodsGroupPurchaseServiceImpl.java
index 237b1b1..3f9575c 100644
--- a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/GoodsGroupPurchaseServiceImpl.java
+++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/GoodsGroupPurchaseServiceImpl.java
@@ -66,6 +66,7 @@
             this.updateById(goodsGroupPurchase);
         }
         //TODO 添加调度任务 处理团购商品开始结束
+
     }
 
     /**
diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/GoodsSeckillServiceImpl.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/GoodsSeckillServiceImpl.java
index 6c21b7c..af7e470 100644
--- a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/GoodsSeckillServiceImpl.java
+++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/GoodsSeckillServiceImpl.java
@@ -17,19 +17,13 @@
 import com.ruoyi.goods.mapper.GoodsSeckillMapper;
 import com.ruoyi.goods.service.IGoodsSeckillService;
 import com.ruoyi.goods.service.IGoodsSkuService;
-import com.ruoyi.system.api.constants.DelayTaskEnum;
-import com.ruoyi.system.api.domain.DelayTask;
+import com.ruoyi.goods.service.async.AsyncMethodService;
 import com.ruoyi.system.api.domain.dto.ListStatusDTO;
 import com.ruoyi.system.api.feignClient.OrderClient;
-import com.ruoyi.system.api.feignClient.SysUserClient;
-import java.time.Duration;
-import java.time.LocalDateTime;
 import java.util.List;
 import java.util.Optional;
-import java.util.concurrent.TimeUnit;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
-import org.redisson.api.RedissonClient;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
@@ -49,8 +43,7 @@
     private final IGoodsSkuService goodsSkuService;
     private final OrderClient orderClient;
     private final RedisService redisService;
-    private final SysUserClient sysUserClient;
-    private final RedissonClient redissonClient;
+    private final AsyncMethodService asyncMethodService;
 
     @Override
     @Transactional(rollbackFor = Exception.class)
@@ -67,117 +60,10 @@
         this.saveBatch(goodsSeckills);
 
         for (GoodsSeckill goodsSeckill : goodsSeckills) {
-            LocalDateTime startTime = goodsSeckill.getStartTime();
-            LocalDateTime endTime = goodsSeckill.getEndTime();
-            LocalDateTime checkTime = LocalDateTime.now().plusHours(1);
-            //秒杀在一小时内开始
-            if (checkTime.isAfter(startTime)) {
-                Long id = goodsSeckill.getId();
-                LocalDateTime now = LocalDateTime.now();
-                String seckillStartTaskKey = DelayTaskEnum.SECKILL_START_TASK.getCode() + "-" + id;
-                //秒杀已经开始
-                if (now.isAfter(startTime)) {
-                    //查询延时任务
-                    DelayTask startDelayTask = sysUserClient.getDelayTask(
-                            seckillStartTaskKey).getData();
-                    if (StringUtils.isNull(startDelayTask)) {
-                        redisService.setCacheObject(
-                                seckillStartTaskKey,
-                                startTime, 3L, TimeUnit.SECONDS);
-                        startDelayTask = new DelayTask();
-                        startDelayTask.setDelFlag(0);
-                        startDelayTask.setCreateTime(LocalDateTime.now());
-                        startDelayTask.setEndTime(LocalDateTime.now().plusSeconds(3));
-                        startDelayTask.setRedisKey(
-                                seckillStartTaskKey);
-                        sysUserClient.addDelayTask(startDelayTask);
-                    } else {
-                        if (!startDelayTask.getEndTime().isEqual(startTime)) {
-                            sysUserClient.deleteDelayTask(
-                                    seckillStartTaskKey);
-                            redisService.deleteObject(
-                                    seckillStartTaskKey);
-                            redisService.setCacheObject(
-                                    seckillStartTaskKey,
-                                    startTime, 3L, TimeUnit.SECONDS);
-                            startDelayTask = new DelayTask();
-                            startDelayTask.setDelFlag(0);
-                            startDelayTask.setCreateTime(LocalDateTime.now());
-                            startDelayTask.setEndTime(LocalDateTime.now().plusSeconds(3));
-                            startDelayTask.setRedisKey(
-                                    seckillStartTaskKey);
-                            sysUserClient.addDelayTask(startDelayTask);
-                        }
-                    }
-                } else {
-                    DelayTask startDelayTask = sysUserClient.getDelayTask(
-                            seckillStartTaskKey).getData();
-                    Duration duration = Duration.between(LocalDateTime.now(), startTime);
-
-                    if (StringUtils.isNull(startDelayTask)) {
-                        redisService.setCacheObject(
-                                seckillStartTaskKey,
-                                startTime, duration.toMillis(), TimeUnit.MILLISECONDS);
-                        startDelayTask = new DelayTask();
-                        startDelayTask.setDelFlag(0);
-                        startDelayTask.setCreateTime(LocalDateTime.now());
-                        startDelayTask.setEndTime(startTime);
-                        startDelayTask.setRedisKey(
-                                seckillStartTaskKey);
-                        sysUserClient.addDelayTask(startDelayTask);
-                    } else {
-                        if (!startDelayTask.getEndTime().isEqual(startTime)) {
-                            sysUserClient.deleteDelayTask(
-                                    seckillStartTaskKey);
-                            redisService.deleteObject(
-                                    seckillStartTaskKey);
-                            redisService.setCacheObject(
-                                    seckillStartTaskKey,
-                                    startTime, duration.toMillis(), TimeUnit.MILLISECONDS);
-                            startDelayTask = new DelayTask();
-                            startDelayTask.setDelFlag(0);
-                            startDelayTask.setCreateTime(LocalDateTime.now());
-                            startDelayTask.setEndTime(startTime);
-                            startDelayTask.setRedisKey(
-                                    seckillStartTaskKey);
-                            sysUserClient.addDelayTask(startDelayTask);
-                        }
-                    }
-                }
-                String seckillEndTaskKey = DelayTaskEnum.SECKILL_END_TASK.getCode() + "-" + id;
-                DelayTask endDelayTask = sysUserClient.getDelayTask(
-                        seckillEndTaskKey).getData();
-                // 如果延时任务为空,创建延时任务控制活动定时开始和结束
-                if (StringUtils.isNull(endDelayTask)) {
-                    Duration duration = Duration.between(LocalDateTime.now(), endTime);
-                    redisService.setCacheObject(
-                            seckillEndTaskKey,
-                            endTime, duration.toMillis(), TimeUnit.MILLISECONDS);
-                    endDelayTask = new DelayTask();
-                    endDelayTask.setDelFlag(0);
-                    endDelayTask.setCreateTime(LocalDateTime.now());
-                    endDelayTask.setEndTime(endTime);
-                    endDelayTask.setRedisKey(seckillEndTaskKey);
-                    sysUserClient.addDelayTask(endDelayTask);
-                } else {
-                    Duration duration = Duration.between(LocalDateTime.now(), endTime);
-                    if (!endDelayTask.getEndTime().isEqual(endTime)) {
-                        sysUserClient.deleteDelayTask(seckillEndTaskKey);
-                        redisService.deleteObject(seckillEndTaskKey);
-                        redisService.setCacheObject(
-                                seckillEndTaskKey,
-                                endTime, duration.toMillis(), TimeUnit.MILLISECONDS);
-                        endDelayTask = new DelayTask();
-                        endDelayTask.setDelFlag(0);
-                        endDelayTask.setCreateTime(LocalDateTime.now());
-                        endDelayTask.setEndTime(endTime);
-                        endDelayTask.setRedisKey(seckillEndTaskKey);
-                        sysUserClient.addDelayTask(endDelayTask);
-                    }
-                }
-            }
+            asyncMethodService.seckillScheduleTask(goodsSeckill);
         }
     }
+
 
     /**
      * 获取秒杀商品列表的分页数据
@@ -198,6 +84,7 @@
      * @param upd 商品秒杀数据传输对象
      */
     @Override
+    @Transactional(rollbackFor = Exception.class)
     public void updGoodsSeckill(GoodsSeckillUpd upd) {
         //查询秒杀商品
         GoodsSeckill goodsSeckill = this.getById(upd.getId());
@@ -206,6 +93,7 @@
         }
         GoodsSeckill goodsSeckillUpd = BeanUtils.copyBean(upd, GoodsSeckill.class);
         this.updateById(goodsSeckillUpd);
+        asyncMethodService.seckillScheduleTask(goodsSeckill);
     }
 
     /**
diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/task/GoodsScheduler.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/task/GoodsScheduler.java
new file mode 100644
index 0000000..942f3e8
--- /dev/null
+++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/task/GoodsScheduler.java
@@ -0,0 +1,54 @@
+package com.ruoyi.goods.task;
+
+import com.ruoyi.common.core.enums.ListingStatusEnum;
+import com.ruoyi.common.core.enums.StartStatusEnum;
+import com.ruoyi.goods.domain.GoodsGroupPurchase;
+import com.ruoyi.goods.domain.GoodsSeckill;
+import com.ruoyi.goods.service.IGoodsGroupPurchaseService;
+import com.ruoyi.goods.service.IGoodsSeckillService;
+import com.ruoyi.goods.service.async.AsyncMethodService;
+import java.time.LocalDateTime;
+import java.util.List;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+
+/**
+ * @author mitao
+ * @date 2024/5/24
+ */
+@Slf4j
+@Component
+@RequiredArgsConstructor
+public class GoodsScheduler {
+
+    private final AsyncMethodService asyncMethodService;
+    private final IGoodsSeckillService goodsSeckillService;
+    private final IGoodsGroupPurchaseService goodsGroupPurchaseService;
+
+    @Scheduled(cron = "0 0 */1 * * ?")
+    private void timingTask() {
+        handleTaskStart();
+    }
+
+    private void handleTaskStart() {
+        log.info(">>>>>>>>>>>>>>>>>>>>定时任务秒杀/团购开始执行<<<<<<<<<<<<<<<<<<<<");
+        LocalDateTime checkTime = LocalDateTime.now().plusHours(1);
+        List<GoodsSeckill> list = goodsSeckillService.lambdaQuery()
+                .eq(GoodsSeckill::getListingStatus, ListingStatusEnum.ON_SHELVES)
+                .eq(GoodsSeckill::getStartStatus, StartStatusEnum.NOT_STARTED)
+                .le(GoodsSeckill::getStartTime, checkTime)
+                .list();
+        for (GoodsSeckill goodsSeckill : list) {
+            asyncMethodService.seckillScheduleTask(goodsSeckill);
+        }
+        List<GoodsGroupPurchase> groupPurchaseList = goodsGroupPurchaseService.lambdaQuery()
+                .eq(GoodsGroupPurchase::getListingStatus, ListingStatusEnum.ON_SHELVES)
+                .eq(GoodsGroupPurchase::getStartStatus, StartStatusEnum.NOT_STARTED)
+                .le(GoodsGroupPurchase::getStartTime, checkTime).list();
+        for (GoodsGroupPurchase goodsGroupPurchase : groupPurchaseList) {
+            asyncMethodService.groupPurchaseScheduleTask(goodsGroupPurchase);
+        }
+    }
+}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/listener/RedisListener.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/listener/RedisListener.java
index 0421920..f484dae 100644
--- a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/listener/RedisListener.java
+++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/listener/RedisListener.java
@@ -86,31 +86,31 @@
     //延时任务表
     @Async
     public void autoStartSeckill(Long seckillId) {
-        log.info("autoStartSeckill scheduler task is running :" + seckillId);
+        log.info("autoStartSeckill scheduler task is running :{}", seckillId);
         goodsSkuClient.startSeckill(seckillId);
 
     }
 
     @Async
     public void autoEndSeckill(Long seckillId) {
-        log.info("autoEndSeckill scheduler task is running :" + seckillId);
+        log.info("autoEndSeckill scheduler task is running :{}", seckillId);
         goodsSkuClient.endSeckill(seckillId);
     }
 
     @Async
     public void autoStartGroupPurchase(Long GroupPurchaseId) {
-        log.info("autoStartGroupPurchase scheduler task is running :" + GroupPurchaseId);
+        log.info("autoStartGroupPurchase scheduler task is running :{}", GroupPurchaseId);
         goodsSkuClient.startGroupPurchase(GroupPurchaseId);
     }
 
     @Async
     public void autoEndGroupPurchase(Long GroupPurchaseId) {
-        log.info("autoEndGroupPurchase scheduler task is running :" + GroupPurchaseId);
+        log.info("autoEndGroupPurchase scheduler task is running :{}", GroupPurchaseId);
         goodsSkuClient.endGroupPurchase(GroupPurchaseId);
     }
 
     @Async
     public void autoCancelOrder(Long orderId) {
-        log.info("autoCancelOrder scheduler task is running :" + orderId);
+        log.info("autoCancelOrder scheduler task is running :{}", orderId);
     }
 }

--
Gitblit v1.7.1