浏览代码

FormalTaskUtil增加容错处理,避免并发修改taskMap时出现的遍历异常

luoshi 4 年之前
父节点
当前提交
866459c1cd
共有 1 个文件被更改,包括 26 次插入21 次删除
  1. 26 21
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/utils/FormalTaskUtil.java

+ 26 - 21
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/utils/FormalTaskUtil.java

@@ -1,21 +1,19 @@
 package cn.com.qmth.stmms.biz.utils;
 
-import java.text.ParseException;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Set;
-
+import cn.com.qmth.stmms.biz.exam.model.Marker;
 import com.google.common.collect.HashMultimap;
 import com.google.common.collect.Multiset;
 import com.google.common.collect.SetMultimap;
 
-import cn.com.qmth.stmms.biz.exam.model.Marker;
+import java.text.ParseException;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
 
 /**
  * Redis zset替代方案,单JVM内部针对已领取未给分正评任务的管理工具
- * 
+ *
  * @author luoshi
- * 
  */
 public class FormalTaskUtil {
 
@@ -23,7 +21,7 @@ public class FormalTaskUtil {
 
     /**
      * 尝试领取某个任务
-     * 
+     *
      * @param marker
      * @param taskId
      * @return
@@ -44,7 +42,7 @@ public class FormalTaskUtil {
 
     /**
      * 是否已领取某个任务
-     * 
+     *
      * @param marker
      * @param taskId
      * @return
@@ -53,18 +51,23 @@ public class FormalTaskUtil {
         String key = getKey(marker);
         Set<TaskEntry> set = taskMap.get(key);
         if (set != null) {
-            for (TaskEntry entry : set) {
+            boolean success = false;
+            Set<TaskEntry> loopSet = new HashSet<>(set);
+            for (TaskEntry entry : loopSet) {
                 if (entry.getTaskId().equals(taskId) && entry.getMarkerId() == marker.getId()) {
-                    return true;
+                    success = true;
+                    break;
                 }
             }
+            loopSet.clear();
+            return success;
         }
         return false;
     }
 
     /**
      * 删除某个已完成的任务
-     * 
+     *
      * @param marker
      * @param taskId
      */
@@ -77,7 +80,7 @@ public class FormalTaskUtil {
 
     /**
      * 某个科目已领取未给分的任务总数
-     * 
+     *
      * @param examId
      * @param subjectCode
      * @return
@@ -89,7 +92,7 @@ public class FormalTaskUtil {
 
     /**
      * 某个评卷员已领取未给分的任务总数
-     * 
+     *
      * @param marker
      * @return
      */
@@ -97,18 +100,20 @@ public class FormalTaskUtil {
         Set<TaskEntry> set = taskMap.get(getKey(marker));
         int count = 0;
         if (set != null) {
-            for (TaskEntry obj : set) {
+            Set<TaskEntry> loopSet = new HashSet<>(set);
+            for (TaskEntry obj : loopSet) {
                 if (obj.getMarkerId() == marker.getId()) {
                     count++;
                 }
             }
+            loopSet.clear();
         }
         return count;
     }
 
     /**
      * 清除某个科目已领取未给分的任务
-     * 
+     *
      * @param examId
      * @param subjectCode
      */
@@ -120,7 +125,7 @@ public class FormalTaskUtil {
 
     /**
      * 清除某个评卷员已领取未给分的任务
-     * 
+     *
      * @param marker
      */
     public static void clear(Marker marker) {
@@ -138,7 +143,7 @@ public class FormalTaskUtil {
 
     /**
      * 获取当前已领取的任务快照
-     * 
+     *
      * @param examId
      * @param subjectCode
      * @param groupNumber
@@ -186,7 +191,7 @@ public class FormalTaskUtil {
 
     /**
      * 获取当前时间戳
-     * 
+     *
      * @return
      * @throws ParseException
      */
@@ -196,7 +201,7 @@ public class FormalTaskUtil {
 
     /**
      * 时间戳相隔分钟
-     * 
+     *
      * @return
      * @throws ParseException
      */