|
|
@@ -11,23 +11,30 @@ import com.fs.system.service.ISysConfigService;
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
import org.apache.commons.lang3.exception.ExceptionUtils;
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
+import org.springframework.beans.factory.annotation.Value;
|
|
|
import org.springframework.scheduling.annotation.Scheduled;
|
|
|
import org.springframework.stereotype.Component;
|
|
|
|
|
|
+import javax.annotation.Resource;
|
|
|
import java.util.Calendar;
|
|
|
import java.util.concurrent.atomic.AtomicBoolean;
|
|
|
|
|
|
+/**
|
|
|
+ * 看课/完课/短链等定时任务。SaaS 模式下按租户执行。
|
|
|
+ */
|
|
|
@Component
|
|
|
@Slf4j
|
|
|
public class CourseWatchLogScheduler {
|
|
|
private final AtomicBoolean isRunning1 = new AtomicBoolean(false);
|
|
|
-
|
|
|
private final AtomicBoolean isRunning2 = new AtomicBoolean(false);
|
|
|
-
|
|
|
private final AtomicBoolean isRunning3 = new AtomicBoolean(false);
|
|
|
-
|
|
|
private final AtomicBoolean isRunning4 = new AtomicBoolean(false);
|
|
|
|
|
|
+ @Value("${saas.task.enabled:false}")
|
|
|
+ private boolean saasTaskEnabled;
|
|
|
+ @Resource
|
|
|
+ private TenantTaskRunner tenantTaskRunner;
|
|
|
+
|
|
|
@Autowired
|
|
|
private FsCourseWatchLogMapper courseWatchLogMapper;
|
|
|
|
|
|
@@ -83,111 +90,136 @@ public class CourseWatchLogScheduler {
|
|
|
// }
|
|
|
|
|
|
|
|
|
+ /** 检查看课状态:每分钟执行;整5分钟时顺带创建完课消息。SaaS 开启时按租户执行。 */
|
|
|
@Scheduled(fixedRate = 60000) // 每分钟执行一次
|
|
|
public void checkWatchStatus() {
|
|
|
- // 尝试设置标志为 true,表示任务开始执行
|
|
|
if (!isRunning1.compareAndSet(false, true)) {
|
|
|
log.info("检查看课中任务执行 - 上一个任务尚未完成,跳过此次执行");
|
|
|
return;
|
|
|
}
|
|
|
+ try {
|
|
|
+ if (saasTaskEnabled) {
|
|
|
+ tenantTaskRunner.runForEachTenant(this::doCheckWatchStatus);
|
|
|
+ } else {
|
|
|
+ doCheckWatchStatus();
|
|
|
+ }
|
|
|
+ } finally {
|
|
|
+ isRunning1.set(false);
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
+ private void doCheckWatchStatus() {
|
|
|
try {
|
|
|
log.info("检查看课中任务执行>>>>>>>>>>>>");
|
|
|
courseWatchLogService.scheduleBatchUpdateToDatabase();
|
|
|
courseWatchLogService.checkWatchStatus();
|
|
|
log.info("检查看课中任务执行完成>>>>>>>>>>>>");
|
|
|
-
|
|
|
- // 检查当前时间是否为整五分钟(0, 5, 10, 15, ... 55分钟)
|
|
|
Calendar calendar = Calendar.getInstance();
|
|
|
int minute = calendar.get(Calendar.MINUTE);
|
|
|
-
|
|
|
- // 只有当分钟数是5的倍数时才执行创建完课消息
|
|
|
if (minute % 5 == 0) {
|
|
|
try {
|
|
|
- long startTime = System.currentTimeMillis();
|
|
|
- log.info("创建完课消息 - 定时任务开始"+System.currentTimeMillis());
|
|
|
+ log.info("创建完课消息 - 定时任务开始 {}", System.currentTimeMillis());
|
|
|
sopLogsTaskService.createCourseFinishMsg();
|
|
|
- long endTime = System.currentTimeMillis();
|
|
|
- long duration = endTime - startTime;
|
|
|
- log.info("创建完课消息 - 定时任务成功完成"+duration);
|
|
|
+ log.info("创建完课消息 - 定时任务成功完成");
|
|
|
} catch (Exception e) {
|
|
|
log.error("创建完课消息 - 定时任务执行失败", ExceptionUtils.getStackTrace(e));
|
|
|
}
|
|
|
}
|
|
|
} catch (Exception e) {
|
|
|
log.error("检查看课中任务执行完成 - 定时任务执行失败", ExceptionUtils.getStackTrace(e));
|
|
|
- } finally {
|
|
|
- // 重置标志为 false,表示任务已完成
|
|
|
- isRunning1.set(false);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
- /**
|
|
|
- * 创建完课消息
|
|
|
- */
|
|
|
+ /** 创建完课消息:每5分钟执行。SaaS 开启时按租户执行。 */
|
|
|
@Scheduled(fixedRate = 300000) // 每五分钟执行一次
|
|
|
public void createCourseFinishMsg() {
|
|
|
- // 尝试设置标志为 true,表示任务开始执行
|
|
|
if (!isRunning3.compareAndSet(false, true)) {
|
|
|
log.warn("创建完课消息 - 上一个任务尚未完成,跳过此次执行");
|
|
|
return;
|
|
|
}
|
|
|
-
|
|
|
try {
|
|
|
- log.info("创建完课消息 - 定时任务开始");
|
|
|
- sopLogsTaskService.createCourseFinishMsg();
|
|
|
- log.info("创建完课消息 - 定时任务成功完成");
|
|
|
+ if (saasTaskEnabled) {
|
|
|
+ tenantTaskRunner.runForEachTenant(() -> {
|
|
|
+ try {
|
|
|
+ log.info("创建完课消息 - 定时任务开始");
|
|
|
+ sopLogsTaskService.createCourseFinishMsg();
|
|
|
+ log.info("创建完课消息 - 定时任务成功完成");
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("创建完课消息 - 定时任务执行失败", e);
|
|
|
+ }
|
|
|
+ });
|
|
|
+ } else {
|
|
|
+ log.info("创建完课消息 - 定时任务开始");
|
|
|
+ sopLogsTaskService.createCourseFinishMsg();
|
|
|
+ log.info("创建完课消息 - 定时任务成功完成");
|
|
|
+ }
|
|
|
} catch (Exception e) {
|
|
|
log.error("创建完课消息 - 定时任务执行失败", e);
|
|
|
} finally {
|
|
|
- // 重置标志为 false,表示任务已完成
|
|
|
isRunning3.set(false);
|
|
|
}
|
|
|
-
|
|
|
}
|
|
|
|
|
|
@Autowired
|
|
|
private IFsCourseLinkService courseLinkService;
|
|
|
|
|
|
|
|
|
- // 定时任务,每天0点执行
|
|
|
-
|
|
|
- /**
|
|
|
- * 每天删除过期短链
|
|
|
- */
|
|
|
- @Scheduled(cron = "0 0 0 * * ?") // 0点0分0秒执行
|
|
|
+ /** 每天 0 点删除过期短链。SaaS 开启时按租户执行。 */
|
|
|
+ @Scheduled(cron = "0 0 0 * * ?")
|
|
|
public void delCourseExpireLink() {
|
|
|
try {
|
|
|
- log.info("删除过期短链 - 定时任务开始");
|
|
|
- courseLinkService.delCourseExpireLink();
|
|
|
- log.info("删除过期短链 - 定时任务成功完成");
|
|
|
+ if (saasTaskEnabled) {
|
|
|
+ tenantTaskRunner.runForEachTenant(() -> {
|
|
|
+ try {
|
|
|
+ log.info("删除过期短链 - 定时任务开始");
|
|
|
+ courseLinkService.delCourseExpireLink();
|
|
|
+ log.info("删除过期短链 - 定时任务成功完成");
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("删除过期短链 - 定时任务执行失败", e);
|
|
|
+ }
|
|
|
+ });
|
|
|
+ } else {
|
|
|
+ log.info("删除过期短链 - 定时任务开始");
|
|
|
+ courseLinkService.delCourseExpireLink();
|
|
|
+ log.info("删除过期短链 - 定时任务成功完成");
|
|
|
+ }
|
|
|
} catch (Exception e) {
|
|
|
log.error("删除过期短链 - 定时任务执行失败", e);
|
|
|
}
|
|
|
-
|
|
|
}
|
|
|
|
|
|
- @Scheduled(fixedRate = 30000) // 每分钟执行一次
|
|
|
+ /** WXH5 检查会员看课状态:每30秒执行。SaaS 开启时按租户执行。 */
|
|
|
+ @Scheduled(fixedRate = 30000)
|
|
|
public void checkFsUserWatchStatus() {
|
|
|
- // 尝试设置标志为 true,表示任务开始执行
|
|
|
if (!isRunning4.compareAndSet(false, true)) {
|
|
|
log.warn("WXH5-检查会员看课中任务执行 - 上一个任务尚未完成,跳过此次执行");
|
|
|
return;
|
|
|
}
|
|
|
try {
|
|
|
- log.info("WXH5-检查会员看课中任务执行>>>>>>>>>>>>");
|
|
|
- courseWatchLogService.scheduleUpdateDurationToDatabase();
|
|
|
- courseWatchLogService.checkFsUserWatchStatus();
|
|
|
- log.info("WXH5-检查会员看课中任务执行完成>>>>>>>>>>>>");
|
|
|
- }catch (Exception e) {
|
|
|
+ if (saasTaskEnabled) {
|
|
|
+ tenantTaskRunner.runForEachTenant(() -> {
|
|
|
+ try {
|
|
|
+ log.info("WXH5-检查会员看课中任务执行>>>>>>>>>>>>");
|
|
|
+ courseWatchLogService.scheduleUpdateDurationToDatabase();
|
|
|
+ courseWatchLogService.checkFsUserWatchStatus();
|
|
|
+ log.info("WXH5-检查会员看课中任务执行完成>>>>>>>>>>>>");
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("WXH5-检查会员看课中任务执行完成 - 定时任务执行失败", e);
|
|
|
+ }
|
|
|
+ });
|
|
|
+ } else {
|
|
|
+ log.info("WXH5-检查会员看课中任务执行>>>>>>>>>>>>");
|
|
|
+ courseWatchLogService.scheduleUpdateDurationToDatabase();
|
|
|
+ courseWatchLogService.checkFsUserWatchStatus();
|
|
|
+ log.info("WXH5-检查会员看课中任务执行完成>>>>>>>>>>>>");
|
|
|
+ }
|
|
|
+ } catch (Exception e) {
|
|
|
log.error("WXH5-检查会员看课中任务执行完成 - 定时任务执行失败", e);
|
|
|
} finally {
|
|
|
- // 重置标志为 false,表示任务已完成
|
|
|
isRunning4.set(false);
|
|
|
}
|
|
|
-
|
|
|
}
|
|
|
|
|
|
|