Jelajahi Sumber

修改评卷任务提交后的释放策略,需要等到数据库事务提交后才进行

luoshi 4 tahun lalu
induk
melakukan
bae50518a8

+ 44 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/mark/model/SubmitResult.java

@@ -0,0 +1,44 @@
+package cn.com.qmth.stmms.biz.mark.model;
+
+/**
+ * 评卷提交结果状态
+ */
+public class SubmitResult {
+
+    private boolean success;
+
+    private MarkLibrary markLibrary;
+
+    private TrialLibrary trialLibrary;
+
+    public static SubmitResult faile() {
+        return new SubmitResult(false, null, null);
+    }
+
+    public static SubmitResult success(MarkLibrary library) {
+        return new SubmitResult(true, library, null);
+    }
+
+    public static SubmitResult success(TrialLibrary library) {
+        return new SubmitResult(true, null, library);
+    }
+
+    private SubmitResult(boolean success, MarkLibrary markLibrary, TrialLibrary trialLibrary) {
+        this.success = success;
+        this.markLibrary = markLibrary;
+        this.trialLibrary = trialLibrary;
+    }
+
+    public boolean isSuccess() {
+        return success;
+    }
+
+    public MarkLibrary getMarkLibrary() {
+        return markLibrary;
+    }
+
+    public TrialLibrary getTrialLibrary() {
+        return trialLibrary;
+    }
+
+}

+ 22 - 28
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/mark/service/Impl/MarkServiceImpl.java

@@ -324,28 +324,22 @@ public class MarkServiceImpl implements MarkService {
     }
 
     /**
-     * 释放某个评卷员已领取的正评任务
+     * 释放某个评卷员已完成的评卷任务
      *
-     * @param library - 正评任务
-     * @param marker  - 评卷员
-     */
-    @Override
-    public void releaseLibrary(MarkLibrary library, Marker marker) {
-        TaskLock taskLock = TaskLockUtil.getFormalTask(getGroupKey(marker));
-        taskLock.remove(getApplyTaskId(library), library.getTaskNumber(), marker.getId());
-        taskLock.refresh(marker.getId());
-    }
-
-    /**
-     * 释放某个评卷员已领取的试评任务
-     *
-     * @param library - 试评任务
-     * @param marker  - 评卷员
+     * @param result - 评卷结果
+     * @param marker - 评卷员
      */
     @Override
-    public void releaseLibrary(TrialLibrary library, Marker marker) {
-        TaskLock taskLock = TaskLockUtil.getTrialTask(getGroupKey(marker));
-        taskLock.remove(getApplyTaskId(library, marker), 1, marker.getId());
+    public void releaseTask(SubmitResult result, Marker marker) {
+        if (result.getMarkLibrary() != null) {
+            TaskLock taskLock = TaskLockUtil.getFormalTask(getGroupKey(marker));
+            taskLock.remove(getApplyTaskId(result.getMarkLibrary()), result.getMarkLibrary().getTaskNumber(),
+                    marker.getId());
+            taskLock.refresh(marker.getId());
+        } else if (result.getTrialLibrary() != null) {
+            TaskLock taskLock = TaskLockUtil.getTrialTask(getGroupKey(marker));
+            taskLock.remove(getApplyTaskId(result.getTrialLibrary(), marker), 1, marker.getId());
+        }
     }
 
     /**
@@ -455,12 +449,12 @@ public class MarkServiceImpl implements MarkService {
      */
     @Override
     @Transactional
-    public boolean submitTask(MarkResult result, Marker marker) {
+    public SubmitResult submitTask(MarkResult result, Marker marker) {
         // 判断评卷分组是否存在/评卷是否结束
         MarkGroup group = groupDao.findOne(marker.getExamId(), marker.getSubjectCode(), marker.getGroupNumber());
         if (group == null || group.getStatus() == MarkStatus.FINISH || group.getStatus().getValue() != result
                 .getStatusValue()) {
-            return false;
+            return SubmitResult.faile();
         }
 
         // 根据评卷状态选择读取不同的评卷任务
@@ -473,8 +467,8 @@ public class MarkServiceImpl implements MarkService {
                         result.getSpent(), LibraryStatus.WAITING, LibraryStatus.MARKED, LibraryStatus.INSPECTED) != 0) {
                     saveProblemHistory(result, library);
                     updateMarkedCount(group);
-                    releaseLibrary(library, marker);
-                    return true;
+                    //releaseLibrary(library, marker);
+                    return SubmitResult.success(library);
                 }
             }
             if (library != null && library.getExamId().equals(group.getExamId()) && library.getSubjectCode()
@@ -483,8 +477,8 @@ public class MarkServiceImpl implements MarkService {
                     .isNotBlank(result.getScoreList())) {
                 if (submitLibrary(library, marker, group, result)) {
                     updateMarkedCount(group);
-                    releaseLibrary(library, marker);
-                    return true;
+                    //releaseLibrary(library, marker);
+                    return SubmitResult.success(library);
                 }
             }
         } else if (group.getStatus() == MarkStatus.TRIAL) {
@@ -515,12 +509,12 @@ public class MarkServiceImpl implements MarkService {
                         trialTagDao.save(result.getTagList(history));
                     }
                     updateMarkedCount(group);
-                    releaseLibrary(library, marker);
-                    return true;
+                    //releaseLibrary(library, marker);
+                    return SubmitResult.success(library);
                 }
             }
         }
-        return false;
+        return SubmitResult.faile();
     }
 
     private void saveProblemHistory(MarkResult result, MarkLibrary library) {

+ 5 - 16
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/mark/service/MarkService.java

@@ -1,10 +1,7 @@
 package cn.com.qmth.stmms.biz.mark.service;
 
 import cn.com.qmth.stmms.biz.exam.model.*;
-import cn.com.qmth.stmms.biz.mark.model.ArbitrateHistory;
-import cn.com.qmth.stmms.biz.mark.model.MarkLibrary;
-import cn.com.qmth.stmms.biz.mark.model.MarkResult;
-import cn.com.qmth.stmms.biz.mark.model.TrialLibrary;
+import cn.com.qmth.stmms.biz.mark.model.*;
 import cn.com.qmth.stmms.common.enums.ScorePolicy;
 import cn.com.qmth.stmms.common.enums.ThirdPolicy;
 
@@ -13,20 +10,12 @@ import java.util.List;
 public interface MarkService {
 
     /**
-     * 释放某个评卷员已领取的正评任务
+     * 释放某个评卷员已完成的评卷任务
      *
-     * @param library
-     * @param marker
-     */
-    void releaseLibrary(MarkLibrary library, Marker marker);
-
-    /**
-     * 释放某个评卷员已领取的试评任务
-     *
-     * @param library
+     * @param result
      * @param marker
      */
-    void releaseLibrary(TrialLibrary library, Marker marker);
+    void releaseTask(SubmitResult result, Marker marker);
 
     /**
      * /** 释放某个大题的锁定任务
@@ -198,7 +187,7 @@ public interface MarkService {
      * @param marker
      * @return
      */
-    boolean submitTask(MarkResult result, Marker marker);
+    SubmitResult submitTask(MarkResult result, Marker marker);
 
     /**
      * 管理员/组长重置某个试评任务

+ 0 - 52
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/utils/AbstractTask.java

@@ -1,52 +0,0 @@
-package cn.com.qmth.stmms.biz.utils;
-
-import java.util.Date;
-
-import org.apache.log4j.Logger;
-
-public abstract class AbstractTask implements Runnable {
-
-    protected static final Logger logger = Logger.getLogger(AbstractTask.class);
-
-    private Date start;
-
-    private Date finish;
-
-    private String status;
-
-    public AbstractTask() {
-        status("等待开始");
-    }
-
-    @Override
-    public void run() {
-        logger.info("运行中");
-        start = new Date();
-        status("运行中");
-
-        process();
-
-        status("任务结束");
-        finish = new Date();
-        logger.info("任务结束");
-    }
-
-    protected abstract void process();
-
-    protected void status(String status) {
-        this.status = status;
-    }
-
-    public Date getStart() {
-        return start;
-    }
-
-    public Date getFinish() {
-        return finish;
-    }
-
-    public String getStatus() {
-        return status;
-    }
-
-}

+ 0 - 34
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/utils/BlockTaskCountUtil.java

@@ -1,34 +0,0 @@
-package cn.com.qmth.stmms.biz.utils;
-
-import org.springframework.dao.DataAccessException;
-import org.springframework.data.redis.connection.RedisConnection;
-import org.springframework.data.redis.core.RedisCallback;
-import org.springframework.data.redis.core.StringRedisTemplate;
-
-import cn.com.qmth.stmms.common.redis.RedisKeyBuilder;
-
-public class BlockTaskCountUtil {
-
-    public static void incrBlockTotalCount(StringRedisTemplate redisTemplate, final int blockId) {
-        redisTemplate.execute(new RedisCallback<Long>() {
-
-            @Override
-            public Long doInRedis(RedisConnection conn) throws DataAccessException {
-                try {
-                    conn.incr(RedisKeyBuilder.getBlockTotalCountKey(blockId).getBytes("UTF-8"));
-                } catch (Exception e) {
-                }
-                return 0l;
-            }
-        });
-    }
-
-    public static void addBlockMarkedTask(StringRedisTemplate redisTemplate, final int blockId, final int libraryId) {
-        redisTemplate.opsForSet().add(RedisKeyBuilder.getBlockMarkedTaskKey(blockId), String.valueOf(libraryId));
-    }
-
-    public static int getBlockMarkedTaskCount(StringRedisTemplate redisTemplate, final int blockId) {
-        Long count = redisTemplate.opsForSet().size(RedisKeyBuilder.getBlockMarkedTaskKey(blockId));
-        return count != null ? count.intValue() : 0;
-    }
-}

+ 0 - 197
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/utils/CurrentTaskUtil2.java

@@ -1,197 +0,0 @@
-package cn.com.qmth.stmms.biz.utils;
-
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Set;
-import java.util.concurrent.locks.Lock;
-import java.util.concurrent.locks.ReentrantLock;
-
-import cn.com.qmth.stmms.biz.exam.model.Marker;
-
-/**
- * Redis zset替代方案,单JVM内部针对已领取未给分任务的管理工具
- * 
- * @author luoshi
- * 
- */
-public class CurrentTaskUtil2 {
-
-    private static Map<String, TaskGroup> store = new HashMap<String, TaskGroup>();
-
-    /**
-     * 尝试领取某个任务
-     * 
-     * @param marker
-     * @param libraryId
-     * @return
-     */
-    public static boolean add(Marker marker, int libraryId) {
-        return getTaskMap(marker.getExamId(), marker.getSubjectCode()).add(libraryId, marker.getId());
-    }
-
-    /**
-     * 删除某个已完成的任务
-     * 
-     * @param marker
-     * @param libraryId
-     */
-    public static void remove(Marker marker, int libraryId) {
-        getTaskMap(marker.getExamId(), marker.getSubjectCode()).remove(libraryId);
-    }
-
-    /**
-     * 某个科目已领取未给分的任务总数
-     * 
-     * @param examId
-     * @param subjectCode
-     * @return
-     */
-    public static int count(int examId, String subjectCode) {
-        return getTaskMap(examId, subjectCode).count();
-    }
-
-    /**
-     * 某个评卷员已领取未给分的任务总数
-     * 
-     * @param marker
-     * @return
-     */
-    public static int count(Marker marker) {
-        return getTaskMap(marker.getExamId(), marker.getSubjectCode()).count(marker.getId());
-    }
-
-    /**
-     * 清除某个科目已领取未给分的任务
-     * 
-     * @param examId
-     * @param subjectCode
-     */
-    public static void clear(int examId, String subjectCode) {
-        getTaskMap(examId, subjectCode).clear();
-    }
-
-    /**
-     * 清除某个评卷员已领取未给分的任务
-     * 
-     * @param examId
-     * @param subjectCode
-     */
-    public static void clear(Marker marker) {
-        getTaskMap(marker.getExamId(), marker.getSubjectCode()).clear(marker.getId());
-    }
-
-    /**
-     * 获取某个科目的任务控制器
-     * 
-     * @param examId
-     * @param subjectCode
-     * @return
-     */
-    private static TaskGroup getTaskMap(int examId, String subjectCode) {
-        String key = examId + "_" + subjectCode;
-        TaskGroup group = store.get(key);
-        if (group == null) {
-            synchronized (CurrentTaskUtil2.class) {
-                group = store.get(key);
-                if (group == null) {
-                    group = new TaskGroup();
-                    store.put(key, group);
-                }
-            }
-        }
-        return group;
-    }
-}
-
-class TaskGroup {
-
-    // 任务-评卷员对应关系
-    private Map<Integer, Integer> taskStore;
-
-    // 评卷员-任务对应关系
-    private Map<Integer, Set<Integer>> markerStore;
-
-    private Lock lock;
-
-    public TaskGroup() {
-        this.taskStore = new HashMap<Integer, Integer>();
-        this.markerStore = new HashMap<Integer, Set<Integer>>();
-        this.lock = new ReentrantLock();
-    }
-
-    public boolean add(int libraryId, int markerId) {
-        if (taskStore.containsKey(libraryId)) {
-            return false;
-        }
-        lock.lock();
-        try {
-            if (taskStore.containsKey(libraryId)) {
-                return false;
-            }
-            taskStore.put(libraryId, markerId);
-            Set<Integer> set = markerStore.get(markerId);
-            if (set == null) {
-                set = new HashSet<Integer>();
-                markerStore.put(markerId, set);
-            }
-            set.add(libraryId);
-            return true;
-        } catch (Exception e) {
-            return false;
-        } finally {
-            lock.unlock();
-        }
-    }
-
-    public void remove(int libraryId) {
-        lock.lock();
-        try {
-            Integer markerId = taskStore.get(libraryId);
-            if (markerId != null) {
-                markerStore.get(markerId).remove(libraryId);
-            }
-            taskStore.remove(libraryId);
-        } catch (Exception e) {
-        } finally {
-            lock.unlock();
-        }
-    }
-
-    public int count() {
-        return taskStore.size();
-    }
-
-    public int count(int markerId) {
-        try {
-            return markerStore.get(markerId).size();
-        } catch (Exception e) {
-            return 0;
-        }
-    }
-
-    public void clear() {
-        lock.lock();
-        try {
-            taskStore.clear();
-            markerStore.clear();
-        } catch (Exception e) {
-        } finally {
-            lock.unlock();
-        }
-    }
-
-    public void clear(int markerId) {
-        lock.lock();
-        try {
-            Set<Integer> set = markerStore.get(markerId);
-            for (Integer id : set) {
-                taskStore.remove(id);
-            }
-            set.clear();
-        } catch (Exception e) {
-        } finally {
-            lock.unlock();
-        }
-    }
-}

+ 5 - 2
stmms-web/src/main/java/cn/com/qmth/stmms/mark/MarkController.java

@@ -449,9 +449,12 @@ public class MarkController extends BaseController {
             lockService.watch(LockType.GROUP, marker.getExamId(), marker.getSubjectCode(), marker.getGroupNumber());
             lockService.watch(LockType.MARKER, marker.getId());
             lockService.waitlock(LockType.STUDENT, markResult.getStudentId());
-            success = markService.submitTask(markResult, marker);
+            SubmitResult sr = markService.submitTask(markResult, marker);
+            if (sr.isSuccess()) {
+                markService.releaseTask(sr, marker);
+                success = true;
+            }
         } catch (Exception e) {
-            success = false;
             log.error("save task error", e);
         } finally {
             lockService.unlock(LockType.STUDENT, markResult.getStudentId());