diff --git a/web/src/main/java/cn/jlw/web/WebApplication.java b/web/src/main/java/cn/jlw/web/WebApplication.java index 0c528e9e..33e1c213 100644 --- a/web/src/main/java/cn/jlw/web/WebApplication.java +++ b/web/src/main/java/cn/jlw/web/WebApplication.java @@ -16,7 +16,7 @@ import org.springframework.web.WebApplicationInitializer; @EnableCaching @EnableAsync @ComponentScan(basePackages= {"cn.jlw","com.ibeetl.admin","com.ibeetl.jlw"}) -@ServletComponentScan(basePackages = {"cn.jlw.cors", "cn.jlw.filter"}) +@ServletComponentScan(basePackages = "cn.jlw.filter") public class WebApplication extends SpringBootServletInitializer implements WebApplicationInitializer { public static void main(String[] args) { @@ -29,5 +29,4 @@ public class WebApplication extends SpringBootServletInitializer implements WebA factory.addConnectorCustomizers(connector -> connector.setProperty("relaxedQueryChars", "|{}[]\\")); return factory; } - -} +} \ No newline at end of file diff --git a/web/src/main/java/com/ibeetl/jlw/dao/GeneralQuestionLogDao.java b/web/src/main/java/com/ibeetl/jlw/dao/GeneralQuestionLogDao.java index 8c8f7f8f..85a56247 100644 --- a/web/src/main/java/com/ibeetl/jlw/dao/GeneralQuestionLogDao.java +++ b/web/src/main/java/com/ibeetl/jlw/dao/GeneralQuestionLogDao.java @@ -109,5 +109,32 @@ public interface GeneralQuestionLogDao extends BaseMapper { .andEq(GeneralQuestionLog::getGeneralQuestionSettingId, questionSettingId) .count(); } + + /** + * 功能描述:
+ * 通过题目配置ID和添加类型查询题目日志数量 + * + * @param questionSettingId 题目配置ID + * @param type 题目添加类型 + * @return {@link long} + * @Author: lx + * @Date: 2022/12/6 22:59 + */ + default List getByQuestionLogAddType(@NotNull Long questionSettingId, String ...type) { + LambdaQuery lambdaQuery = createLambdaQuery(); + LambdaQuery andCondition = lambdaQuery.condition(); + + boolean isNull = Arrays.stream(type).anyMatch(item -> item == null); + List notNullList = Arrays.stream(type).filter(item -> item != null).collect(Collectors.toList()); + + // 是否添加Null条件 + andCondition = isNull ? andCondition.andIsNull(GeneralQuestionLog::getQuestionLogAddType) : andCondition; + andCondition.orIn(GeneralQuestionLog::getQuestionLogAddType, notNullList); + + return lambdaQuery.and(andCondition) + .andEq(GeneralQuestionLog::getGeneralQuestionLogStatus, 1) + .andEq(GeneralQuestionLog::getGeneralQuestionSettingId, questionSettingId) + .select(); + } } diff --git a/web/src/main/java/com/ibeetl/jlw/enums/QuestionQueueTypeEnum.java b/web/src/main/java/com/ibeetl/jlw/enums/QuestionQueueTypeEnum.java new file mode 100644 index 00000000..8554a046 --- /dev/null +++ b/web/src/main/java/com/ibeetl/jlw/enums/QuestionQueueTypeEnum.java @@ -0,0 +1,13 @@ +package com.ibeetl.jlw.enums; + +/** + * 系统强制交卷的类型 + */ +public enum QuestionQueueTypeEnum { + + // 开课题目提交 + QUESTION_SETTING_QUEUE, + // 通用题目提交 + GENERAL_QUESTION_SETTING_QUEUE + + } \ No newline at end of file diff --git a/web/src/main/java/com/ibeetl/jlw/service/GeneralQuestionSettingService.java b/web/src/main/java/com/ibeetl/jlw/service/GeneralQuestionSettingService.java index 687a59e2..5ce44801 100644 --- a/web/src/main/java/com/ibeetl/jlw/service/GeneralQuestionSettingService.java +++ b/web/src/main/java/com/ibeetl/jlw/service/GeneralQuestionSettingService.java @@ -23,6 +23,7 @@ import com.ibeetl.jlw.dao.QuestionLogSummaryDao; import com.ibeetl.jlw.entity.*; import com.ibeetl.jlw.entity.dto.QuestionSettingDTO; import com.ibeetl.jlw.enums.*; +import com.ibeetl.jlw.service.questionQueue.generalQuestionSettingQueue.GeneralQuestionSettingRedisDelayQueueImpl; import com.ibeetl.jlw.web.query.*; import org.apache.commons.lang3.StringUtils; import org.apache.poi.hssf.usermodel.HSSFWorkbook; @@ -48,8 +49,7 @@ import static cn.jlw.util.CacheUserUtil.getStudent; import static cn.jlw.util.QuestionUtil.shuffleQuestion; import static com.ibeetl.admin.core.util.ExcelUtil.getCellFormatValue; import static com.ibeetl.jlw.enums.QuestionLogAddTypeEnum.FINALLY_SUBMIT; -import static com.ibeetl.jlw.enums.ResourcesQuestionSnapshotFromTypeEnum.CHAPTER_EXERCISE; -import static com.ibeetl.jlw.enums.ResourcesQuestionSnapshotFromTypeEnum.HOMEWORK_FILE; +import static com.ibeetl.jlw.enums.ResourcesQuestionSnapshotFromTypeEnum.*; import static com.ibeetl.jlw.enums.TuckOrErrorEnum.ERROR_TEST; import static com.ibeetl.jlw.enums.TuckOrErrorEnum.TUCK_TEST; @@ -71,6 +71,7 @@ public class GeneralQuestionSettingService extends CoreBaseServicequeryByCondition(PageQuery query){ PageQuery ret = generalQuestionSettingDao.queryByCondition(query); @@ -535,6 +536,10 @@ public class GeneralQuestionSettingService extends CoreBaseServicequeryByCondition(PageQuery query){ PageQuery ret = teacherOpenCourseQuestionSettingDao.queryByCondition(query); @@ -782,6 +784,11 @@ public class TeacherOpenCourseQuestionSettingService extends CoreBaseService + * + * @author: mlx + * @description: + * @date: 2022/12/9 1:02 + * @version: 1.0 + */ +@Data +public class GeneralQuestionSettingDelayed { + + /** + * 题目配置ID + */ + private Long questionSettingId; +} diff --git a/web/src/main/java/com/ibeetl/jlw/service/questionQueue/generalQuestionSettingQueue/GeneralQuestionSettingRedisDelayQueueImpl.java b/web/src/main/java/com/ibeetl/jlw/service/questionQueue/generalQuestionSettingQueue/GeneralQuestionSettingRedisDelayQueueImpl.java new file mode 100644 index 00000000..24a18a8f --- /dev/null +++ b/web/src/main/java/com/ibeetl/jlw/service/questionQueue/generalQuestionSettingQueue/GeneralQuestionSettingRedisDelayQueueImpl.java @@ -0,0 +1,131 @@ +package com.ibeetl.jlw.service.questionQueue.generalQuestionSettingQueue; + +import cn.hutool.core.date.DateUnit; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.thread.ThreadUtil; +import cn.hutool.core.util.ObjectUtil; +import com.ibeetl.jlw.dao.GeneralQuestionLogDao; +import com.ibeetl.jlw.dao.GeneralQuestionSettingDao; +import com.ibeetl.jlw.dao.GeneralQuestionLogDao; +import com.ibeetl.jlw.dao.GeneralQuestionSettingDao; +import com.ibeetl.jlw.entity.GeneralQuestionLog; +import com.ibeetl.jlw.entity.GeneralQuestionSetting; +import com.ibeetl.jlw.enums.QuestionLogAddTypeEnum; +import com.ibeetl.jlw.enums.QuestionQueueTypeEnum; +import com.ibeetl.jlw.service.GeneralQuestionLogService; +import com.ibeetl.jlw.service.GeneralQuestionLogService; +import com.ibeetl.jlw.service.questionQueue.questionSettingQueue.RedisDelayQueue; +import com.ibeetl.jlw.web.query.GeneralQuestionSettingQuery; +import lombok.SneakyThrows; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Lazy; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.PostConstruct; +import javax.validation.constraints.NotNull; +import java.util.Date; +import java.util.List; +import java.util.stream.Collectors; + +import static com.ibeetl.jlw.enums.GlobalPushStatusEnum.PUSH; +import static com.ibeetl.jlw.enums.QuestionLogAddTypeEnum.PRE_SUBMIT; +import static com.ibeetl.jlw.enums.QuestionQueueTypeEnum.GENERAL_QUESTION_SETTING_QUEUE; + +/** + * 功能描述:
+ * Redis延时队列实现类 + * 系统题目配置(试卷自动交卷) + * + * @author: mlx + * @description: + * @date: 2022/12/9 0:41 + * @version: 1.0 + */ +@Service +@Validated +@Transactional +public class GeneralQuestionSettingRedisDelayQueueImpl extends RedisDelayQueue { + + @Autowired + private GeneralQuestionLogDao generalQuestionLogDao; + @Autowired + private GeneralQuestionSettingDao generalQuestionSettingDao; + @Autowired + private GeneralQuestionLogService generalQuestionLogService; + @Autowired @Lazy + private GeneralQuestionSettingRedisDelayQueueImpl questionSettingRedisDelayQueue; + + @Value("${delay.submit.out-time:1800000}") + private Long delaySubmitOutTime ; + + public GeneralQuestionSettingRedisDelayQueueImpl(RedisTemplate redisTemplate) { + super(redisTemplate); + } + + @Override + public void handleMsg(GeneralQuestionSettingDelayed msg) { + final Long questionSettingId = msg.getQuestionSettingId(); Date nowDate = new Date(); + // 查询需要更新状态的题目日志 + List list = generalQuestionLogDao.getByQuestionLogAddType(questionSettingId, PRE_SUBMIT.name(), null); + + // 获取需要修改的日志IDs + List logList = list.stream().map(item -> { + GeneralQuestionLog questionLog = new GeneralQuestionLog(); + questionLog.setGeneralQuestionLogId(item.getGeneralQuestionLogId()); + // 更改为交卷状态 + questionLog.setQuestionLogAddType(QuestionLogAddTypeEnum.FINALLY_SUBMIT); + questionLog.setGeneralQuestionLogUpdateTime(nowDate); + Date addTime = questionLog.getGeneralQuestionLogAddTime(); + if (ObjectUtil.isNotEmpty(addTime)) { + questionLog.setGeneralQuestionLogFinishTime(DateUtil.between(nowDate, addTime, DateUnit.SECOND)); + } + return questionLog; + }).collect(Collectors.toList()); + // 逻辑提交试卷 + generalQuestionLogService.updateBatchTemplate(logList); + } + + /** + * 题目配置,交卷的延迟方法,被动延迟,在某个学生做题时候,进行处理 + * @param questionSettingId + */ + @Async("taskExecutor") + @SneakyThrows + public void questionSettingDelay(Long questionSettingId) { + if (ObjectUtil.isEmpty(questionSettingId)) { + return; + } + + GeneralQuestionSettingQuery questionSettingQuery = new GeneralQuestionSettingQuery(); + questionSettingQuery.setGeneralQuestionSettingId(questionSettingId); + questionSettingQuery.setGeneralQuestionSettingStatus(1); + questionSettingQuery.setGeneralQuestionSettingPushStatus(PUSH); + List list = generalQuestionSettingDao.getValuesByQueryNotWithPermission(questionSettingQuery); + if (ObjectUtil.isEmpty(list)) { + return; + } + GeneralQuestionSetting info = list.get(0); + GeneralQuestionSettingDelayed msg = new GeneralQuestionSettingDelayed(); + Long generalQuestionSettingId = info.getGeneralQuestionSettingId(); + msg.setQuestionSettingId(generalQuestionSettingId); + boolean exists = questionSettingRedisDelayQueue.isExists(GENERAL_QUESTION_SETTING_QUEUE.name(), generalQuestionSettingId.toString()); + if (!exists) { + questionSettingRedisDelayQueue.delay(GENERAL_QUESTION_SETTING_QUEUE.name(), msg, info.getGeneralQuestionEndTime().getTime(), delaySubmitOutTime); + } + } + + /** + * 消费者 + */ + @PostConstruct + public void consumer() { + ThreadUtil.execute(() -> { + questionSettingRedisDelayQueue.loop(GENERAL_QUESTION_SETTING_QUEUE.name()); + }); + } +} diff --git a/web/src/main/java/com/ibeetl/jlw/service/questionQueue/generalQuestionSettingQueue/package-info.java b/web/src/main/java/com/ibeetl/jlw/service/questionQueue/generalQuestionSettingQueue/package-info.java new file mode 100644 index 00000000..cb43a146 --- /dev/null +++ b/web/src/main/java/com/ibeetl/jlw/service/questionQueue/generalQuestionSettingQueue/package-info.java @@ -0,0 +1,9 @@ +/** + * 功能描述:
+ * 作业、考试、章节练习自动延时交卷 + * 通用题目相关,目前是用于考证考试 + * + * @Author: 87966 + * @Date: 2022/12/8 10:37 + */ +package com.ibeetl.jlw.service.questionQueue.generalQuestionSettingQueue; \ No newline at end of file diff --git a/web/src/main/java/com/ibeetl/jlw/service/questionSettingQueue/QuestionSettingDelayed.java b/web/src/main/java/com/ibeetl/jlw/service/questionQueue/questionSettingQueue/QuestionSettingDelayed.java similarity index 78% rename from web/src/main/java/com/ibeetl/jlw/service/questionSettingQueue/QuestionSettingDelayed.java rename to web/src/main/java/com/ibeetl/jlw/service/questionQueue/questionSettingQueue/QuestionSettingDelayed.java index 94445caa..94edacbe 100644 --- a/web/src/main/java/com/ibeetl/jlw/service/questionSettingQueue/QuestionSettingDelayed.java +++ b/web/src/main/java/com/ibeetl/jlw/service/questionQueue/questionSettingQueue/QuestionSettingDelayed.java @@ -1,4 +1,4 @@ -package com.ibeetl.jlw.service.questionSettingQueue; +package com.ibeetl.jlw.service.questionQueue.questionSettingQueue; import lombok.Data; diff --git a/web/src/main/java/com/ibeetl/jlw/service/questionQueue/questionSettingQueue/QuestionSettingRedisDelayQueueImpl.java b/web/src/main/java/com/ibeetl/jlw/service/questionQueue/questionSettingQueue/QuestionSettingRedisDelayQueueImpl.java new file mode 100644 index 00000000..367bd64d --- /dev/null +++ b/web/src/main/java/com/ibeetl/jlw/service/questionQueue/questionSettingQueue/QuestionSettingRedisDelayQueueImpl.java @@ -0,0 +1,126 @@ +package com.ibeetl.jlw.service.questionQueue.questionSettingQueue; + +import cn.hutool.core.date.DateUnit; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.thread.ThreadUtil; +import cn.hutool.core.util.ObjectUtil; +import com.ibeetl.jlw.dao.TeacherOpenCourseQuestionLogDao; +import com.ibeetl.jlw.dao.TeacherOpenCourseQuestionSettingDao; +import com.ibeetl.jlw.entity.TeacherOpenCourseQuestionLog; +import com.ibeetl.jlw.entity.TeacherOpenCourseQuestionSetting; +import com.ibeetl.jlw.enums.QuestionLogAddTypeEnum; +import com.ibeetl.jlw.enums.QuestionQueueTypeEnum; +import com.ibeetl.jlw.service.TeacherOpenCourseQuestionLogService; +import com.ibeetl.jlw.web.query.TeacherOpenCourseQuestionSettingQuery; +import lombok.SneakyThrows; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Lazy; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.PostConstruct; +import javax.validation.constraints.NotNull; +import java.util.Date; +import java.util.List; +import java.util.stream.Collectors; + +import static com.ibeetl.jlw.enums.GlobalPushStatusEnum.PUSH; +import static com.ibeetl.jlw.enums.QuestionLogAddTypeEnum.PRE_SUBMIT; +import static com.ibeetl.jlw.enums.QuestionQueueTypeEnum.QUESTION_SETTING_QUEUE; + +/** + * 功能描述:
+ * Redis延时队列实现类 + * 开课题目配置(试卷自动交卷) + * @author: mlx + * @description: + * @date: 2022/12/9 0:41 + * @version: 1.0 + */ +@Service +@Validated +@Transactional +public class QuestionSettingRedisDelayQueueImpl extends RedisDelayQueue { + + @Autowired + private TeacherOpenCourseQuestionLogDao teacherOpenCourseQuestionLogDao; + @Autowired + private TeacherOpenCourseQuestionSettingDao teacherOpenCourseQuestionSettingDao; + @Autowired + private TeacherOpenCourseQuestionLogService teacherOpenCourseQuestionLogService; + @Autowired @Lazy + private QuestionSettingRedisDelayQueueImpl questionSettingRedisDelayQueue; + + @Value("${delay.submit.out-time:1800000}") + private Long delaySubmitOutTime ; + + public QuestionSettingRedisDelayQueueImpl(RedisTemplate redisTemplate) { + super(redisTemplate); + } + + @Override + public void handleMsg(QuestionSettingDelayed msg) { + final Long questionSettingId = msg.getQuestionSettingId(); Date nowDate = new Date(); + // 查询需要更新状态的题目日志 + List list = teacherOpenCourseQuestionLogDao.getByQuestionLogAddType(questionSettingId, PRE_SUBMIT.name(), null); + + // 获取需要修改的日志IDs + List logList = list.stream().map(item -> { + TeacherOpenCourseQuestionLog questionLog = new TeacherOpenCourseQuestionLog(); + questionLog.setTeacherOpenCourseQuestionLogId(item.getTeacherOpenCourseQuestionLogId()); + // 更改为交卷状态 + questionLog.setQuestionLogAddType(QuestionLogAddTypeEnum.FINALLY_SUBMIT); + questionLog.setTeacherOpenCourseQuestionLogUpdateTime(nowDate); + Date addTime = questionLog.getTeacherOpenCourseQuestionLogAddTime(); + if (ObjectUtil.isNotEmpty(addTime)) { + questionLog.setTeacherOpenCourseQuestionLogFinishTime(DateUtil.between(nowDate, addTime, DateUnit.SECOND)); + } + return questionLog; + }).collect(Collectors.toList()); + // 逻辑提交试卷 + teacherOpenCourseQuestionLogService.updateBatchTemplate(logList); + } + + /** + * 题目配置,交卷的延迟方法,被动延迟,在某个学生做题时候,进行处理 + * @param questionSettingId + */ + @Async("taskExecutor") + @SneakyThrows + public void questionSettingDelay(Long questionSettingId) { + if (ObjectUtil.isEmpty(questionSettingId)) { + return; + } + + TeacherOpenCourseQuestionSettingQuery questionSettingQuery = new TeacherOpenCourseQuestionSettingQuery(); + questionSettingQuery.setTeacherOpenCourseQuestionSettingId(questionSettingId); + questionSettingQuery.setTeacherOpenCourseQuestionSettingStatus(1); + questionSettingQuery.setTeacherOpenCourseQuestionSettingPushStatus(PUSH); + List list = teacherOpenCourseQuestionSettingDao.getValuesByQueryNotWithPermission(questionSettingQuery); + if (ObjectUtil.isEmpty(list)) { + return; + } + TeacherOpenCourseQuestionSetting info = list.get(0); + QuestionSettingDelayed msg = new QuestionSettingDelayed(); + Long teacherOpenCourseQuestionSettingId = info.getTeacherOpenCourseQuestionSettingId(); + msg.setQuestionSettingId(teacherOpenCourseQuestionSettingId); + boolean exists = questionSettingRedisDelayQueue.isExists(QUESTION_SETTING_QUEUE.name(), teacherOpenCourseQuestionSettingId.toString()); + if (!exists) { + questionSettingRedisDelayQueue.delay(QUESTION_SETTING_QUEUE.name(), msg, info.getTeacherOpenCourseQuestionEndTime().getTime(), delaySubmitOutTime); + } + } + + /** + * 消费者 + */ + @PostConstruct + public void consumer() { + ThreadUtil.execute(() -> { + questionSettingRedisDelayQueue.loop(QUESTION_SETTING_QUEUE.name()); + }); + } +} diff --git a/web/src/main/java/com/ibeetl/jlw/service/questionSettingQueue/RedisDelayQueue.java b/web/src/main/java/com/ibeetl/jlw/service/questionQueue/questionSettingQueue/RedisDelayQueue.java similarity index 84% rename from web/src/main/java/com/ibeetl/jlw/service/questionSettingQueue/RedisDelayQueue.java rename to web/src/main/java/com/ibeetl/jlw/service/questionQueue/questionSettingQueue/RedisDelayQueue.java index 227d9622..4931c487 100644 --- a/web/src/main/java/com/ibeetl/jlw/service/questionSettingQueue/RedisDelayQueue.java +++ b/web/src/main/java/com/ibeetl/jlw/service/questionQueue/questionSettingQueue/RedisDelayQueue.java @@ -1,6 +1,7 @@ -package com.ibeetl.jlw.service.questionSettingQueue; +package com.ibeetl.jlw.service.questionQueue.questionSettingQueue; import cn.hutool.core.lang.UUID; +import cn.hutool.json.JSONUtil; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.TypeReference; import com.ibeetl.admin.core.util.PlatformException; @@ -15,6 +16,7 @@ import org.springframework.data.redis.serializer.RedisSerializer; import org.springframework.scheduling.annotation.Async; import org.springframework.scheduling.annotation.EnableAsync; +import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; import java.util.Arrays; import java.util.Set; @@ -42,37 +44,19 @@ public abstract class RedisDelayQueue { zSetOperations = redisTemplate.opsForZSet(); } - @Setter - @Getter + @Data @RequiredArgsConstructor public static class QuestionSettingTaskItem { final public String id; final public T msg; } - public enum QuestionQueueTypeEnum { - questionSetting - } - /** * fastjson序列化对象中存在generic类型时,需要使用TypeReference */ private Type TaskType = new TypeReference>() { }.getType(); - /** - * 功能描述:
- * ZSet的Key 组合规则 - * - * @param ids - * @return {@link String} - * @Author: lx - * @Date: 2022/12/9 0:38 - */ - public String zSetKeyRule(Object ...ids) { - return join(Arrays.asList(ids).toArray(), "_"); - } - /** * 功能描述:
* 将指定延迟消费的消息放入延时队列 @@ -104,7 +88,7 @@ public abstract class RedisDelayQueue { * @Date: 2022/12/9 2:42 */ public boolean isExists(String queueKey, String otherKey) { - Set objects = zSetOperations.rangeByScore(queueKey, 0, -1); + Set objects = zSetOperations.range(queueKey, 0, -1); return objects.stream().anyMatch(item -> item.toString().contains(otherKey)); } @@ -115,11 +99,11 @@ public abstract class RedisDelayQueue { public void loop(String queueKey) { while (!Thread.interrupted()) { // 只取一条 - Set values = zSetOperations.rangeByScore(queueKey, 0, System.currentTimeMillis(), 0, 1); + Set values = zSetOperations.rangeByScore(queueKey, 0,System.currentTimeMillis(), 0, 1); if (values.isEmpty()) { try { // 歇会继续 - Thread.sleep(1000); + Thread.sleep(5000); } catch (InterruptedException e) { break; } @@ -130,17 +114,25 @@ public abstract class RedisDelayQueue { if (zSetOperations.remove(queueKey, s) > 0) { // fastjson反序列化 QuestionSettingTaskItem task = JSON.parseObject(s, TaskType); - handleMsg(task.msg); + handleMsg(JSONUtil.toBean(task.msg.toString(), getCurrentEntityClass())); } } } + /** + * 获取当前注入泛型T的类型 + * + * @return 具体类型 + */ + @SuppressWarnings("unchecked") + private Class getCurrentEntityClass() { + return (Class) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0]; + } + /** * 消费消息 * * @param msg */ - public void handleMsg(T msg) { - throw new PlatformException("需要实现的消费方法!"); - } + public abstract void handleMsg(T msg); } \ No newline at end of file diff --git a/web/src/main/java/com/ibeetl/jlw/service/questionSettingQueue/package-info.java b/web/src/main/java/com/ibeetl/jlw/service/questionQueue/questionSettingQueue/package-info.java similarity index 66% rename from web/src/main/java/com/ibeetl/jlw/service/questionSettingQueue/package-info.java rename to web/src/main/java/com/ibeetl/jlw/service/questionQueue/questionSettingQueue/package-info.java index ca695b52..e58eb7f6 100644 --- a/web/src/main/java/com/ibeetl/jlw/service/questionSettingQueue/package-info.java +++ b/web/src/main/java/com/ibeetl/jlw/service/questionQueue/questionSettingQueue/package-info.java @@ -5,4 +5,4 @@ * @Author: 87966 * @Date: 2022/12/8 10:37 */ -package com.ibeetl.jlw.service.questionSettingQueue; \ No newline at end of file +package com.ibeetl.jlw.service.questionQueue.questionSettingQueue; \ No newline at end of file diff --git a/web/src/main/java/com/ibeetl/jlw/service/questionSettingQueue/QuestionSettingRedisDelayQueueImpl.java b/web/src/main/java/com/ibeetl/jlw/service/questionSettingQueue/QuestionSettingRedisDelayQueueImpl.java deleted file mode 100644 index 231e3288..00000000 --- a/web/src/main/java/com/ibeetl/jlw/service/questionSettingQueue/QuestionSettingRedisDelayQueueImpl.java +++ /dev/null @@ -1,66 +0,0 @@ -package com.ibeetl.jlw.service.questionSettingQueue; - -import com.ibeetl.jlw.dao.TeacherOpenCourseQuestionLogDao; -import com.ibeetl.jlw.entity.TeacherOpenCourseQuestionLog; -import com.ibeetl.jlw.enums.QuestionLogAddTypeEnum; -import com.ibeetl.jlw.service.TeacherOpenCourseQuestionLogService; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.annotation.Lazy; -import org.springframework.data.redis.core.RedisTemplate; -import org.springframework.stereotype.Service; - -import javax.annotation.PostConstruct; -import java.util.List; -import java.util.stream.Collectors; - -import static com.ibeetl.jlw.enums.QuestionLogAddTypeEnum.PRE_SUBMIT; -import static com.ibeetl.jlw.service.questionSettingQueue.RedisDelayQueue.QuestionQueueTypeEnum.questionSetting; - -/** - * 功能描述:
- * - * @author: mlx - * @description: - * @date: 2022/12/9 0:41 - * @version: 1.0 - */ -@Service -public class QuestionSettingRedisDelayQueueImpl extends RedisDelayQueue { - - @Autowired - private TeacherOpenCourseQuestionLogDao teacherOpenCourseQuestionLogDao; - @Autowired - private TeacherOpenCourseQuestionLogService teacherOpenCourseQuestionLogService; - @Autowired @Lazy - private QuestionSettingRedisDelayQueueImpl questionSettingRedisDelayQueue; - - public QuestionSettingRedisDelayQueueImpl(RedisTemplate redisTemplate) { - super(redisTemplate); - } - - @Override - public void handleMsg(QuestionSettingDelayed msg) { - final Long questionSettingId = msg.getQuestionSettingId(); - // 查询需要更新状态的题目日志 - List list = teacherOpenCourseQuestionLogDao.getByQuestionLogAddType(questionSettingId, PRE_SUBMIT.name(), null); - - // 获取需要修改的日志IDs - List logList = list.stream().map(item -> { - TeacherOpenCourseQuestionLog questionLog = new TeacherOpenCourseQuestionLog(); - questionLog.setTeacherOpenCourseQuestionLogId(item.getTeacherOpenCourseQuestionLogId()); - // 更改为交卷状态 - questionLog.setQuestionLogAddType(QuestionLogAddTypeEnum.FINALLY_SUBMIT); - return questionLog; - }).collect(Collectors.toList()); - // 逻辑提交试卷 - teacherOpenCourseQuestionLogService.updateBatchTemplate(logList); - } - - @PostConstruct - public void consumer() { - new Thread(() -> { - // 为了走异步 - questionSettingRedisDelayQueue.loop(questionSetting.name()); - }).start(); - } -} diff --git a/web/src/main/resources/application-dev.properties b/web/src/main/resources/application-dev.properties index 4364067d..27537e87 100644 --- a/web/src/main/resources/application-dev.properties +++ b/web/src/main/resources/application-dev.properties @@ -72,4 +72,6 @@ dynamic.beetlsql.cs.dynamicConnectionSource = master,ds2 #user.orgId=1 #\u6559\u5E08\u7AEF\u548C\u5B66\u751F\u7AEF\u7684\u767B\u5F55\u5730\u5740 -student.teacher.url = http://localhost:8080/ \ No newline at end of file +student.teacher.url = http://localhost:8080/ +#\u8BD5\u5377\u5230\u4EA4\u5377\u65F6\u95F4\u540E\uFF0C\u5EF6\u8FDF\u4EA4\u5377\u7684\u6BEB\u79D2\u6570 +delay.submit.out-time=1800000 \ No newline at end of file diff --git a/web/src/main/resources/application-local.properties b/web/src/main/resources/application-local.properties index fcf93a4a..85fd1057 100644 --- a/web/src/main/resources/application-local.properties +++ b/web/src/main/resources/application-local.properties @@ -72,4 +72,6 @@ dynamic.beetlsql.cs.dynamicConnectionSource = master,ds2 #user.orgId=1 #\u6559\u5E08\u7AEF\u548C\u5B66\u751F\u7AEF\u7684\u767B\u5F55\u5730\u5740 -student.teacher.url = http://localhost:8080/ \ No newline at end of file +student.teacher.url = http://localhost:8080/ +#\u8BD5\u5377\u5230\u4EA4\u5377\u65F6\u95F4\u540E\uFF0C\u5EF6\u8FDF\u4EA4\u5377\u7684\u6BEB\u79D2\u6570 +delay.submit.out-time=1800000 \ No newline at end of file diff --git a/web/src/main/resources/application-prod.properties b/web/src/main/resources/application-prod.properties index e32fc31d..137f4175 100644 --- a/web/src/main/resources/application-prod.properties +++ b/web/src/main/resources/application-prod.properties @@ -68,4 +68,6 @@ dynamic.beetlsql.cs.dbStyle = org.beetl.sql.core.db.MySqlStyle dynamic.beetlsql.cs.dynamicConnectionSource = master,ds2 #\u6559\u5E08\u7AEF\u548C\u5B66\u751F\u7AEF\u7684\u767B\u5F55\u5730\u5740 -student.teacher.url = http://116.205.131.177:8080/ \ No newline at end of file +student.teacher.url = http://116.205.131.177:8080/ +#\u8BD5\u5377\u5230\u4EA4\u5377\u65F6\u95F4\u540E\uFF0C\u5EF6\u8FDF\u4EA4\u5377\u7684\u6BEB\u79D2\u6570 +delay.submit.out-time=1800000 \ No newline at end of file diff --git a/web/src/main/resources/application-test.properties b/web/src/main/resources/application-test.properties index 872bd711..af73b807 100644 --- a/web/src/main/resources/application-test.properties +++ b/web/src/main/resources/application-test.properties @@ -72,4 +72,6 @@ dynamic.beetlsql.cs.dynamicConnectionSource = master,ds2 #user.orgId=1 #\u6559\u5E08\u7AEF\u548C\u5B66\u751F\u7AEF\u7684\u767B\u5F55\u5730\u5740 -student.teacher.url = http://localhost:8080/ \ No newline at end of file +student.teacher.url = http://localhost:8080/ +#\u8BD5\u5377\u5230\u4EA4\u5377\u65F6\u95F4\u540E\uFF0C\u5EF6\u8FDF\u4EA4\u5377\u7684\u6BEB\u79D2\u6570 +delay.submit.out-time=1800000 \ No newline at end of file