自动交卷,不保证数据不丢失

beetlsql3-dev
malx 2 years ago
parent 8949a60f38
commit 7cd4985fbc

@ -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;
}
}

@ -109,5 +109,32 @@ public interface GeneralQuestionLogDao extends BaseMapper<GeneralQuestionLog> {
.andEq(GeneralQuestionLog::getGeneralQuestionSettingId, questionSettingId)
.count();
}
/**
* : <br>
* ID
*
* @param questionSettingId ID
* @param type
* @return {@link long}
* @Author: lx
* @Date: 2022/12/6 22:59
*/
default List<GeneralQuestionLog> getByQuestionLogAddType(@NotNull Long questionSettingId, String ...type) {
LambdaQuery<GeneralQuestionLog> lambdaQuery = createLambdaQuery();
LambdaQuery<GeneralQuestionLog> andCondition = lambdaQuery.condition();
boolean isNull = Arrays.stream(type).anyMatch(item -> item == null);
List<String> 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();
}
}

@ -0,0 +1,13 @@
package com.ibeetl.jlw.enums;
/**
*
*/
public enum QuestionQueueTypeEnum {
// 开课题目提交
QUESTION_SETTING_QUEUE,
// 通用题目提交
GENERAL_QUESTION_SETTING_QUEUE
}

@ -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 CoreBaseService<GeneralQuesti
@Autowired @Lazy
private GeneralResourcesQuestionSnapshotService generalResourcesQuestionSnapshotService;
@Autowired private ResourcesQuestionService resourcesQuestionService;
@Autowired private GeneralQuestionSettingRedisDelayQueueImpl generalQuestionSettingRedisDelayQueue;
public PageQuery<GeneralQuestionSetting>queryByCondition(PageQuery query){
PageQuery ret = generalQuestionSettingDao.queryByCondition(query);
@ -535,6 +536,10 @@ public class GeneralQuestionSettingService extends CoreBaseService<GeneralQuesti
// 学生身份,需要屏蔽答案,再丢给前端
resourcesQuestionSnapshots.forEach(GeneralResourcesQuestionSnapshot::hideAnswer);
}
// 考试自动交卷
if (EnumUtil.contains(fromTypeEnum, EXAM)) {
generalQuestionSettingRedisDelayQueue.questionSettingDelay(generalQuestionSettingId);
}
return resourcesQuestionSnapshots;
}

@ -22,6 +22,8 @@ import com.ibeetl.jlw.entity.*;
import com.ibeetl.jlw.entity.dto.QuestionSettingDTO;
import com.ibeetl.jlw.entity.vo.TeacherOpenCourseQuestionSettingAnalysisVO;
import com.ibeetl.jlw.enums.*;
import com.ibeetl.jlw.service.questionQueue.questionSettingQueue.QuestionSettingRedisDelayQueueImpl;
import com.ibeetl.jlw.service.questionQueue.questionSettingQueue.RedisDelayQueue;
import com.ibeetl.jlw.web.query.*;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
@ -44,8 +46,7 @@ import static cn.jlw.util.CacheUserUtil.getStudent;
import static cn.jlw.util.QuestionUtil.shuffleQuestion;
import static com.ibeetl.jlw.enums.QuestionLogAddTypeEnum.FINALLY_SUBMIT;
import static com.ibeetl.jlw.enums.QuestionLogAddTypeEnum.PRE_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;
import static java.util.stream.Collectors.joining;
@ -72,6 +73,7 @@ public class TeacherOpenCourseQuestionSettingService extends CoreBaseService<Tea
@Autowired private CourseInfoService courseInfoService;
@Autowired private TeacherOpenCourseMergeResourcesQuestionService teacherOpenCourseMergeResourcesQuestionService;
@Autowired private TeacherOpenCourseMergeCourseInfoService teacherOpenCourseMergeCourseInfoService;
@Autowired private QuestionSettingRedisDelayQueueImpl questionSettingRedisDelayQueue;
public PageQuery<TeacherOpenCourseQuestionSetting>queryByCondition(PageQuery query){
PageQuery ret = teacherOpenCourseQuestionSettingDao.queryByCondition(query);
@ -782,6 +784,11 @@ public class TeacherOpenCourseQuestionSettingService extends CoreBaseService<Tea
resourcesQuestionSnapshots.forEach(ResourcesQuestionSnapshot::hideAnswer);
}
// 考试自动交卷
if (EnumUtil.contains(fromTypeEnum, EXAM)) {
questionSettingRedisDelayQueue.questionSettingDelay(teacherOpenCourseQuestionSettingId);
}
return resourcesQuestionSnapshots;
}

@ -0,0 +1,20 @@
package com.ibeetl.jlw.service.questionQueue.generalQuestionSettingQueue;
import lombok.Data;
/**
* : <br>
*
* @author: mlx
* @description:
* @date: 2022/12/9 1:02
* @version: 1.0
*/
@Data
public class GeneralQuestionSettingDelayed {
/**
* ID
*/
private Long questionSettingId;
}

@ -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;
/**
* : <br>
* Redis
*
*
* @author: mlx
* @description:
* @date: 2022/12/9 0:41
* @version: 1.0
*/
@Service
@Validated
@Transactional
public class GeneralQuestionSettingRedisDelayQueueImpl extends RedisDelayQueue<GeneralQuestionSettingDelayed> {
@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<GeneralQuestionLog> list = generalQuestionLogDao.getByQuestionLogAddType(questionSettingId, PRE_SUBMIT.name(), null);
// 获取需要修改的日志IDs
List<GeneralQuestionLog> 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<GeneralQuestionSetting> 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());
});
}
}

@ -0,0 +1,9 @@
/**
* : <br>
*
*
*
* @Author: 87966
* @Date: 2022/12/8 10:37
*/
package com.ibeetl.jlw.service.questionQueue.generalQuestionSettingQueue;

@ -1,4 +1,4 @@
package com.ibeetl.jlw.service.questionSettingQueue;
package com.ibeetl.jlw.service.questionQueue.questionSettingQueue;
import lombok.Data;

@ -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;
/**
* : <br>
* Redis
*
* @author: mlx
* @description:
* @date: 2022/12/9 0:41
* @version: 1.0
*/
@Service
@Validated
@Transactional
public class QuestionSettingRedisDelayQueueImpl extends RedisDelayQueue<QuestionSettingDelayed> {
@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<TeacherOpenCourseQuestionLog> list = teacherOpenCourseQuestionLogDao.getByQuestionLogAddType(questionSettingId, PRE_SUBMIT.name(), null);
// 获取需要修改的日志IDs
List<TeacherOpenCourseQuestionLog> 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<TeacherOpenCourseQuestionSetting> 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());
});
}
}

@ -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<T> {
zSetOperations = redisTemplate.opsForZSet();
}
@Setter
@Getter
@Data
@RequiredArgsConstructor
public static class QuestionSettingTaskItem<T> {
final public String id;
final public T msg;
}
public enum QuestionQueueTypeEnum {
questionSetting
}
/**
* fastjsongeneric使TypeReference
*/
private Type TaskType = new TypeReference<QuestionSettingTaskItem<T>>() {
}.getType();
/**
* : <br>
* ZSetKey
*
* @param ids
* @return {@link String}
* @Author: lx
* @Date: 2022/12/9 0:38
*/
public String zSetKeyRule(Object ...ids) {
return join(Arrays.asList(ids).toArray(), "_");
}
/**
* : <br>
*
@ -104,7 +88,7 @@ public abstract class RedisDelayQueue<T> {
* @Date: 2022/12/9 2:42
*/
public boolean isExists(String queueKey, String otherKey) {
Set<Object> objects = zSetOperations.rangeByScore(queueKey, 0, -1);
Set<Object> objects = zSetOperations.range(queueKey, 0, -1);
return objects.stream().anyMatch(item -> item.toString().contains(otherKey));
}
@ -119,7 +103,7 @@ public abstract class RedisDelayQueue<T> {
if (values.isEmpty()) {
try {
// 歇会继续
Thread.sleep(1000);
Thread.sleep(5000);
} catch (InterruptedException e) {
break;
}
@ -130,17 +114,25 @@ public abstract class RedisDelayQueue<T> {
if (zSetOperations.remove(queueKey, s) > 0) {
// fastjson反序列化
QuestionSettingTaskItem<T> task = JSON.parseObject(s, TaskType);
handleMsg(task.msg);
handleMsg(JSONUtil.toBean(task.msg.toString(), getCurrentEntityClass()));
}
}
}
/**
* T
*
* @return
*/
@SuppressWarnings("unchecked")
private Class<T> getCurrentEntityClass() {
return (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
}
/**
*
*
* @param msg
*/
public void handleMsg(T msg) {
throw new PlatformException("需要实现的消费方法!");
}
public abstract void handleMsg(T msg);
}

@ -5,4 +5,4 @@
* @Author: 87966
* @Date: 2022/12/8 10:37
*/
package com.ibeetl.jlw.service.questionSettingQueue;
package com.ibeetl.jlw.service.questionQueue.questionSettingQueue;

@ -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;
/**
* : <br>
*
* @author: mlx
* @description:
* @date: 2022/12/9 0:41
* @version: 1.0
*/
@Service
public class QuestionSettingRedisDelayQueueImpl extends RedisDelayQueue<QuestionSettingDelayed> {
@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<TeacherOpenCourseQuestionLog> list = teacherOpenCourseQuestionLogDao.getByQuestionLogAddType(questionSettingId, PRE_SUBMIT.name(), null);
// 获取需要修改的日志IDs
List<TeacherOpenCourseQuestionLog> 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();
}
}

@ -73,3 +73,5 @@ dynamic.beetlsql.cs.dynamicConnectionSource = master,ds2
#\u6559\u5E08\u7AEF\u548C\u5B66\u751F\u7AEF\u7684\u767B\u5F55\u5730\u5740
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

@ -73,3 +73,5 @@ dynamic.beetlsql.cs.dynamicConnectionSource = master,ds2
#\u6559\u5E08\u7AEF\u548C\u5B66\u751F\u7AEF\u7684\u767B\u5F55\u5730\u5740
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

@ -69,3 +69,5 @@ 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/
#\u8BD5\u5377\u5230\u4EA4\u5377\u65F6\u95F4\u540E\uFF0C\u5EF6\u8FDF\u4EA4\u5377\u7684\u6BEB\u79D2\u6570
delay.submit.out-time=1800000

@ -73,3 +73,5 @@ dynamic.beetlsql.cs.dynamicConnectionSource = master,ds2
#\u6559\u5E08\u7AEF\u548C\u5B66\u751F\u7AEF\u7684\u767B\u5F55\u5730\u5740
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
Loading…
Cancel
Save