diff --git a/exam-module-judgement/exam-module-judgement-biz/src/main/java/pc/exam/pp/module/judgement/service/TaskManager.java b/exam-module-judgement/exam-module-judgement-biz/src/main/java/pc/exam/pp/module/judgement/service/TaskManager.java index b22f33b3..b6e891b6 100644 --- a/exam-module-judgement/exam-module-judgement-biz/src/main/java/pc/exam/pp/module/judgement/service/TaskManager.java +++ b/exam-module-judgement/exam-module-judgement-biz/src/main/java/pc/exam/pp/module/judgement/service/TaskManager.java @@ -28,46 +28,38 @@ public class TaskManager { /** 开始任务(每秒执行一次) */ public void startTask(StuInTheExam stuInTheExam, StuTheExamInfo stuTheExamInfo, String token, AtomicInteger countdown, AtomicInteger counter) { - // 已存在就不重复启动 - tasks.computeIfAbsent(token, k -> - scheduler.scheduleAtFixedRate(safe(() -> { - // 每秒 + 1 - int current = counter.incrementAndGet(); - // 获取当前值并递减 - int remaining = countdown.decrementAndGet(); - log.debug("任务 {} tick at {}", token, System.currentTimeMillis()); + tasks.computeIfAbsent(token, k -> { + Runnable task = safe(() -> { + int current = counter.incrementAndGet(); + int remaining = countdown.decrementAndGet(); + log.debug("任务 {} tick at {}", token, System.currentTimeMillis()); - if (current == stuInTheExam.getTimes()) { - // 提示学生端进行文件的上传 - stuTheExamInfo.setUpload(0); - // 重新进行计时 - counter.set(0); + if (current == stuInTheExam.getTimes()) { + stuTheExamInfo.setUpload(0); + counter.set(0); + } + if (remaining <= 0) { + ScheduledFuture future = tasks.remove(token); + if (future != null) { + future.cancel(false); + stuTheExamInfo.setEndStatus(0); + log.info("任务 {} 已完成并取消", token); } - // 如果计数减到0,取消任务 - if (remaining <= 0) { - ScheduledFuture future = tasks.get(token); - if (future != null) { - future.cancel(false); - tasks.remove(token); - // 发送最后一条消息 - stuTheExamInfo.setEndStatus(0); - log.info("任务 {} 已完成并取消", token); - } - } - // 时间转变 - String time = formatLongDuration(remaining); - stuTheExamInfo.setTime(time); - webSocketSenderApi.sendObject(UserTypeEnum.ADMIN.getValue(), "InTheExam", stuTheExamInfo); - }), 0, 1, TimeUnit.SECONDS) - ); + } + stuTheExamInfo.setTime(formatLongDuration(remaining)); + webSocketSenderApi.sendObject(UserTypeEnum.ADMIN.getValue(), "InTheExam", stuTheExamInfo); + }); + return scheduler.scheduleAtFixedRate(task, 0, 1, TimeUnit.SECONDS); + }); log.info("任务 {} 已启动", token); } /** 结束任务 */ public void stopTask(String token) { - ScheduledFuture f = tasks.remove(token); - if (f != null) { - f.cancel(false); + ScheduledFuture future = tasks.get(token); + if (future != null) { + future.cancel(false); + tasks.remove(token); log.info("任务 {} 已停止", token); } else { log.warn("任务 {} 不存在", token);