Browse Source

fix:防止定时任务重复执行

刘俊驰 4 months ago
parent
commit
7db90d3229

+ 134 - 35
cooleshow-app/src/main/java/com/yonge/cooleshow/admin/task/TaskController.java

@@ -6,7 +6,9 @@ import com.yonge.cooleshow.biz.dal.service.*;
 import com.yonge.cooleshow.common.constant.SysConfigConstant;
 import com.yonge.cooleshow.common.controller.BaseController;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
+import com.yonge.toolset.payment.util.DistributedLock;
 import com.yonge.toolset.utils.date.DateUtil;
+import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.io.FileUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.redisson.api.RBucket;
@@ -32,6 +34,7 @@ import java.util.concurrent.TimeUnit;
 @RestController
 @RequestMapping("${app-config.url.admin:}/task")
 @ApiIgnore
+@Slf4j
 public class TaskController extends BaseController {
     @Autowired
     private UserOrderService userOrderService;
@@ -82,6 +85,7 @@ public class TaskController extends BaseController {
 
     @Autowired
     private UserMusicService userMusicService;
+
     /***
      * 轮询用户订单
      * @author liweifan
@@ -90,9 +94,17 @@ public class TaskController extends BaseController {
      */
     @GetMapping("/pollingOrder")
     public HttpResponseResult pollingOrder() {
-        userOrderService.pollingOrder();
-        userPaymentCoreService.scanPaymentTimeoutOrderRecord();
-        userPaymentCoreService.scanRefundOrderRecord();
+
+        DistributedLock.of(redissonClient).runIfLockCanGet("pollingOrder", () -> {
+            try {
+
+                userOrderService.pollingOrder();
+                userPaymentCoreService.scanPaymentTimeoutOrderRecord();
+                userPaymentCoreService.scanRefundOrderRecord();
+            }catch (Exception e){
+                log.error("pollingOrder error", e);
+            }
+        }, 10L, TimeUnit.SECONDS);
         return succeed();
     }
 
@@ -104,24 +116,48 @@ public class TaskController extends BaseController {
      */
     @GetMapping("/daysTask")
     public HttpResponseResult<Boolean> daysTask() {
-        //超过天数无琴房课的解除绑定关系
-        userBindingTeacherService.unbindTask();
-        //平台老师结算
-        platformCashAccountRecordService.updateWaitRecord();
+
+        DistributedLock.of(redissonClient).runIfLockCanGet("daysTask", () -> {
+            try {
+
+                //超过天数无琴房课的解除绑定关系
+                userBindingTeacherService.unbindTask();
+                //平台老师结算
+                platformCashAccountRecordService.updateWaitRecord();
+            }catch (Exception e){
+                log.error("daysTask error", e);
+            }
+        }, 10L, TimeUnit.SECONDS);
         return succeed(true);
     }
 
     // 老师作业布置
     @PostMapping(value = "/teacherSend")
     public HttpResponseResult<Object> sendTodayNotRepliedAndNotDecorateHomework() {
-        courseScheduleService.sendTodayNotRepliedAndNotDecorateHomework();
+
+        DistributedLock.of(redissonClient).runIfLockCanGet("teacherSend", () -> {
+            try {
+
+                courseScheduleService.sendTodayNotRepliedAndNotDecorateHomework();
+            }catch (Exception e){
+                log.error("teacherSend error", e);
+            }
+        }, 10L, TimeUnit.SECONDS);
         return HttpResponseResult.succeed();
     }
 
     //老师课酬
     @PostMapping(value = "/teacherEarning")
     public HttpResponseResult<Object> sendTeacherEarning() {
-        userAccountRecordService.sendTeacherEarning();
+
+        DistributedLock.of(redissonClient).runIfLockCanGet("teacherEarning", () -> {
+            try {
+
+                userAccountRecordService.sendTeacherEarning();
+            }catch (Exception e){
+                log.error("teacherEarning error", e);
+            }
+        }, 10L, TimeUnit.SECONDS);
         return HttpResponseResult.succeed();
     }
 
@@ -142,14 +178,30 @@ public class TaskController extends BaseController {
     //营销活动
     @PostMapping(value = "/activityState")
     public HttpResponseResult<Object> activityState() {
-        activityPlanService.activityState();
+
+        DistributedLock.of(redissonClient).runIfLockCanGet("activityState", () -> {
+            try {
+
+                activityPlanService.activityState();
+            }catch (Exception e){
+                log.error("activityState error", e);
+            }
+        }, 10L, TimeUnit.SECONDS);
         return HttpResponseResult.succeed();
     }
 
     //活动中定时轮询
     @PostMapping(value = "/activityIng")
     public HttpResponseResult<Object> activityIng() {
-        activityPlanService.activityIng();
+
+        DistributedLock.of(redissonClient).runIfLockCanGet("activityIng", () -> {
+            try {
+
+                activityPlanService.activityIng();
+            }catch (Exception e){
+                log.error("activityIng error", e);
+            }
+        }, 10L, TimeUnit.SECONDS);
         return HttpResponseResult.succeed();
     }
 
@@ -161,7 +213,14 @@ public class TaskController extends BaseController {
     @GetMapping("/test")
     public HttpResponseResult<Object> test(@RequestParam("activityId") Long activityId) {
 
-        activityPlanEvaluationService.successActivity(activityId);
+        DistributedLock.of(redissonClient).runIfLockCanGet("test", () -> {
+            try {
+
+                activityPlanEvaluationService.successActivity(activityId);
+            }catch (Exception e){
+                log.error("test error", e);
+            }
+        }, 10L, TimeUnit.SECONDS);
         return HttpResponseResult.succeed();
     }
 
@@ -172,15 +231,21 @@ public class TaskController extends BaseController {
     @GetMapping("/virtualNumber")
     public HttpResponseResult<Object> virtualNumber() {
 
-        // 曲目
-        musicSheetService.setVirtualNumber();
-        // 专辑
-        musicAlbumService.setVirtualNumber();
-        // 视频课 暂时不做课程数据
-        // videoLessonGroupService.setVirtualNumber();
-        // 个人风采
-        teacherStyleVideoService.setVirtualNumber();
-
+        DistributedLock.of(redissonClient).runIfLockCanGet("virtualNumber", () -> {
+            try {
+
+                // 曲目
+                musicSheetService.setVirtualNumber();
+                // 专辑
+                musicAlbumService.setVirtualNumber();
+                // 视频课 暂时不做课程数据
+                // videoLessonGroupService.setVirtualNumber();
+                // 个人风采
+                teacherStyleVideoService.setVirtualNumber();
+            }catch (Exception e){
+                log.error("virtualNumber error", e);
+            }
+        }, 10L, TimeUnit.SECONDS);
         return HttpResponseResult.succeed();
     }
 
@@ -189,10 +254,15 @@ public class TaskController extends BaseController {
      */
     @GetMapping("/batchSending")
     public HttpResponseResult<Object> batchSending() {
+        DistributedLock.of(redissonClient).runIfLockCanGet("batchSending", () -> {
+            try {
 
-        // 群发消息定时
-        customerServiceBatchSendingService.scheduleSendMessage();
-
+                // 群发消息定时
+                customerServiceBatchSendingService.scheduleSendMessage();
+            }catch (Exception e){
+                log.error("batchSending error", e);
+            }
+        }, 10L, TimeUnit.SECONDS);
         return HttpResponseResult.succeed();
     }
 
@@ -202,10 +272,15 @@ public class TaskController extends BaseController {
      */
     @GetMapping("/destroyLiveRoom")
     public HttpResponseResult<Object> destroyLiveRoom() {
+        DistributedLock.of(redissonClient).runIfLockCanGet("destroyLiveRoom", () -> {
+            try {
 
-        // 群发消息定时
-        liveRoomService.destroyLiveRoom();
-
+                // 群发消息定时
+                liveRoomService.destroyLiveRoom();
+            }catch (Exception e){
+                log.error("destroyLiveRoom error", e);
+            }
+        }, 10L, TimeUnit.SECONDS);
         return HttpResponseResult.succeed();
     }
 
@@ -231,10 +306,15 @@ public class TaskController extends BaseController {
      */
     @GetMapping("/sendPlatformAuditMessage")
     public HttpResponseResult<Object> sendPlatformAuditMessage() {
+        DistributedLock.of(redissonClient).runIfLockCanGet("sendPlatformAuditMessage", () -> {
+            try {
 
-        // 群发消息定时
-        tenantUnbindRecordService.sendPlatformAuditMessage();
-
+                // 群发消息定时
+                tenantUnbindRecordService.sendPlatformAuditMessage();
+            }catch (Exception e){
+                log.error("sendPlatformAuditMessage error", e);
+            }
+        }, 10L, TimeUnit.SECONDS);
         return HttpResponseResult.succeed();
     }
 
@@ -244,10 +324,15 @@ public class TaskController extends BaseController {
      */
     @GetMapping("/sendTenantAlbumMessage")
     public HttpResponseResult<Object> sendTenantAlbumMessage() {
+        DistributedLock.of(redissonClient).runIfLockCanGet("sendTenantAlbumMessage", () -> {
+            try {
 
-        // 群发消息定时
-        userTenantAlbumRecordService.sendTenantAlbumMessage();
-
+                // 群发消息定时
+                userTenantAlbumRecordService.sendTenantAlbumMessage();
+            }catch (Exception e){
+                log.error("sendTenantAlbumMessage error", e);
+            }
+        }, 10L, TimeUnit.SECONDS);
         return HttpResponseResult.succeed();
     }
 
@@ -257,12 +342,26 @@ public class TaskController extends BaseController {
      */
     @GetMapping("/workOverdue")
     public void workOverdue(){
-        userMusicService.workOverdue();
+        DistributedLock.of(redissonClient).runIfLockCanGet("workOverdue", () -> {
+            try {
+
+                userMusicService.workOverdue();
+            }catch (Exception e){
+                log.error("workOverdue error", e);
+            }
+        }, 10L, TimeUnit.SECONDS);
     }
 
     //课程开始前一20分组提醒
     @GetMapping("/courseStartRemind")
     public void courseStartRemind(){
-        courseScheduleService.courseStartRemind();
+        DistributedLock.of(redissonClient).runIfLockCanGet("courseStartRemind", () -> {
+            try {
+
+                courseScheduleService.courseStartRemind();
+            }catch (Exception e){
+                log.error("courseStartRemind error", e);
+            }
+        }, 10L, TimeUnit.SECONDS);
     }
 }

+ 36 - 3
cooleshow-app/src/main/java/com/yonge/cooleshow/student/task/TaskController.java

@@ -7,6 +7,9 @@ import com.yonge.cooleshow.biz.dal.service.StudentTotalService;
 import com.yonge.cooleshow.biz.dal.service.VipCardRecordService;
 import com.yonge.cooleshow.common.controller.BaseController;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
+import com.yonge.toolset.payment.util.DistributedLock;
+import lombok.extern.slf4j.Slf4j;
+import org.redisson.api.RedissonClient;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
@@ -14,6 +17,7 @@ import org.springframework.web.bind.annotation.RestController;
 import springfox.documentation.annotations.ApiIgnore;
 
 import java.util.List;
+import java.util.concurrent.TimeUnit;
 
 /**
  * @Author: liweifan
@@ -22,6 +26,7 @@ import java.util.List;
 @RestController
 @RequestMapping("${app-config.url.student:}/task")
 @ApiIgnore
+@Slf4j
 public class TaskController extends BaseController {
     @Autowired
     private StudentTotalService studentTotalService;
@@ -31,6 +36,10 @@ public class TaskController extends BaseController {
     private VipCardRecordService vipCardRecordService;
     @Autowired
     private CourseRepliedService repliedService;
+
+
+    @Autowired
+    private RedissonClient redissonClient;
     /***
      * 查询所有学生统计数据
      * @author liweifan
@@ -51,7 +60,15 @@ public class TaskController extends BaseController {
     @GetMapping("/halfHourTask")
     public HttpResponseResult<Boolean> halfHourTask() {
         //会员卡到期提醒
-        vipCardRecordService.pollExpireMsg();
+        // 并发执行锁
+        DistributedLock.of(redissonClient).runIfLockCanGet("halfHourTask", () -> {
+            try {
+
+                vipCardRecordService.pollExpireMsg();
+            }catch (Exception e){
+                log.error("halfHourTask error", e);
+            }
+        }, 10L, TimeUnit.SECONDS);
         return succeed(true);
     }
 
@@ -65,7 +82,15 @@ public class TaskController extends BaseController {
     @GetMapping("/studentFirstBuy")
     public HttpResponseResult<Boolean> studentFirstBuy() {
         //统计学员第一次购买时间
-        studentTimeService.totalStudentTime();
+        // 并发执行锁
+        DistributedLock.of(redissonClient).runIfLockCanGet("studentFirstBuy", () -> {
+            try {
+
+                studentTimeService.totalStudentTime();
+            }catch (Exception e){
+                log.error("studentFirstBuy error", e);
+            }
+        }, 10L, TimeUnit.SECONDS);
         return succeed(true);
     }
 
@@ -76,7 +101,15 @@ public class TaskController extends BaseController {
      */
     @GetMapping("/noRepliedTeacher")
     public HttpResponseResult noRepliedTeacher() {
-        repliedService.noRepliedTeacher();
+
+        DistributedLock.of(redissonClient).runIfLockCanGet("noRepliedTeacher", () -> {
+            try {
+
+                repliedService.noRepliedTeacher();
+            }catch (Exception e){
+                log.error("noRepliedTeacher error", e);
+            }
+        }, 10L, TimeUnit.SECONDS);
         return succeed();
     }
 }

+ 95 - 8
cooleshow-app/src/main/java/com/yonge/cooleshow/teacher/task/TaskController.java

@@ -4,7 +4,10 @@ import com.yonge.cooleshow.biz.dal.entity.TeacherTotal;
 import com.yonge.cooleshow.biz.dal.service.*;
 import com.yonge.cooleshow.common.controller.BaseController;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
+import com.yonge.toolset.payment.util.DistributedLock;
 import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.redisson.api.RedissonClient;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
@@ -12,6 +15,7 @@ import org.springframework.web.bind.annotation.RestController;
 import springfox.documentation.annotations.ApiIgnore;
 
 import java.util.List;
+import java.util.concurrent.TimeUnit;
 
 /**
  * @Author: liweifan
@@ -20,6 +24,7 @@ import java.util.List;
 @RestController
 @RequestMapping("${app-config.url.teacher:}/task")
 @ApiIgnore
+@Slf4j
 public class TaskController extends BaseController {
     @Autowired
     private TeacherTotalService teacherTotalService;
@@ -33,6 +38,8 @@ public class TaskController extends BaseController {
     @Autowired
     private DivBackRecordService divBackRecordService;
 
+    @Autowired
+    private RedissonClient redissonClient;
     /***
      * 查询所有老师统计数据
      * @author liweifan
@@ -41,7 +48,19 @@ public class TaskController extends BaseController {
      */
     @GetMapping("/queryTeacherTotal")
     public HttpResponseResult<List<TeacherTotal>> queryTeacherTotal() {
-        return succeed(teacherTotalService.queryTeacherTotal());
+
+        // 并发执行锁
+        DistributedLock.of(redissonClient).runIfLockCanGet("queryTeacherTotal", () -> {
+            try {
+
+                 succeed(teacherTotalService.queryTeacherTotal());
+            }catch (Exception e){
+                log.error("queryTeacherTotal error", e);
+            }
+
+
+        }, 10L, TimeUnit.SECONDS);
+        return succeed();
     }
 
     /**
@@ -50,20 +69,52 @@ public class TaskController extends BaseController {
      */
     @GetMapping("/opsCourseGroup")
     public HttpResponseResult<Object> opsCourseGroup() {
-        courseGroupService.opsCourseGroup();
+
+        // 并发执行锁
+        DistributedLock.of(redissonClient).runIfLockCanGet("opsCourseGroup", () -> {
+            try {
+
+                courseGroupService.opsCourseGroup();
+            }catch (Exception e){
+                log.error("opsCourseGroup error", e);
+            }
+
+
+        }, 10L, TimeUnit.SECONDS);
         return HttpResponseResult.succeed();
     }
 
     @ApiOperation("定时任务-销毁房间-直播间")
     @GetMapping("/destroyExpiredLiveRoom")
     public void destroyExpiredLiveRoom() {
-        liveRoomService.destroyExpiredLiveRoom();
+        // 并发执行锁
+        DistributedLock.of(redissonClient).runIfLockCanGet("destroyExpiredLiveRoom", () -> {
+            try {
+
+                liveRoomService.destroyExpiredLiveRoom();
+            }catch (Exception e){
+                log.error("destroyExpiredLiveRoom error", e);
+            }
+
+
+        }, 10L, TimeUnit.SECONDS);
     }
 
     @ApiOperation("定时任务-创建房间-直播间")
     @GetMapping("/createCourseLiveRoom")
     public void createCourseLiveRoom() {
-        liveRoomService.createCourseLiveRoom();
+
+        // 并发执行锁
+        DistributedLock.of(redissonClient).runIfLockCanGet("createCourseLiveRoom", () -> {
+            try {
+
+                liveRoomService.createCourseLiveRoom();
+            }catch (Exception e){
+                log.error("createCourseLiveRoom error", e);
+            }
+
+
+        }, 10L, TimeUnit.SECONDS);
     }
 
     @GetMapping("/getRedisValueByKey")
@@ -73,26 +124,62 @@ public class TaskController extends BaseController {
 
     @GetMapping("/courseRemind")
     public HttpResponseResult<Object> courseRemind() {
-        scheduleService.courseRemind();
+        // 并发执行锁
+        DistributedLock.of(redissonClient).runIfLockCanGet("courseRemind", () -> {
+            try {
+
+                scheduleService.courseRemind();
+            }catch (Exception e){
+                log.error("courseRemind error", e);
+            }
+
+
+        }, 10L, TimeUnit.SECONDS);
         return HttpResponseResult.succeed();
     }
 
     @GetMapping("/courseStatus")
     public HttpResponseResult<Object> courseStatus() {
-        scheduleService.scheduleTask();
+
+        // 并发执行锁
+        DistributedLock.of(redissonClient).runIfLockCanGet("courseStatus", () -> {
+            try {
+
+                scheduleService.scheduleTask();
+            }catch (Exception e){
+                log.error("courseStatus error", e);
+            }
+        }, 10L, TimeUnit.SECONDS);
         return HttpResponseResult.succeed();
     }
 
     @GetMapping("/teacherSalary")
     public HttpResponseResult<Object> teacherSalary() {
-        scheduleService.teacherSalaryTask();
+
+        // 并发执行锁
+        DistributedLock.of(redissonClient).runIfLockCanGet("teacherSalary", () -> {
+            try {
+
+                scheduleService.teacherSalaryTask();
+            }catch (Exception e){
+                log.error("teacherSalary error", e);
+            }
+        }, 10L, TimeUnit.SECONDS);
         return HttpResponseResult.succeed();
     }
 
 
     @GetMapping("/divBack")
     public HttpResponseResult<Object> divBack() {
-        divBackRecordService.divBack();
+        // 并发执行锁
+        DistributedLock.of(redissonClient).runIfLockCanGet("divBack", () -> {
+            try {
+
+                divBackRecordService.divBack();
+            }catch (Exception e){
+                log.error("divBack error", e);
+            }
+        }, 10L, TimeUnit.SECONDS);
         return HttpResponseResult.succeed();
     }
 }