Sfoglia il codice sorgente

优化TaskLockUtil性能;修改TaskLock.list方法放回数据类型;修改领取任务分页,尝试解决重复领取已评任务问题;

luoshi 4 anni fa
parent
commit
9726a0a50b

+ 11 - 13
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/utils/TaskLock.java

@@ -1,11 +1,9 @@
 package cn.com.qmth.stmms.biz.utils;
 
-import java.util.Date;
-
-import net.sf.json.JSONArray;
-import net.sf.json.JSONObject;
 import cn.com.qmth.stmms.common.utils.DateUtils;
 
+import java.util.*;
+
 /**
  * 链表模式实现的任务互斥锁工具
  */
@@ -150,19 +148,19 @@ public class TaskLock {
         return count;
     }
 
-    public JSONArray list() {
-        JSONArray array = new JSONArray();
+    public List<Map<String, Object>> list() {
+        List<Map<String, Object>> list = new LinkedList<>();
         LockNode node = head.next;
         while (node != null) {
-            JSONObject obj = new JSONObject();
-            obj.accumulate("taskId", node.getId());
-            obj.accumulate("number", node.getNumber());
-            obj.accumulate("markerId", node.getOwner());
-            obj.accumulate("time", DateUtils.formatDateTime(new Date(node.getTime())));
-            array.add(obj);
+            Map<String, Object> map = new HashMap<>();
+            map.put("taskId", node.getId());
+            map.put("number", node.getNumber());
+            map.put("markerId", node.getOwner());
+            map.put("time", DateUtils.formatDateTime(new Date(node.getTime())));
+            list.add(map);
             node = node.next;
         }
-        return array;
+        return list;
     }
 
     private static class LockNode {

+ 18 - 32
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/utils/TaskLockUtil.java

@@ -1,57 +1,43 @@
 package cn.com.qmth.stmms.biz.utils;
 
+import java.util.HashMap;
 import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
 
 public class TaskLockUtil {
 
     // 评卷任务并发处理互斥锁
-    private static Map<String, TaskLock> formalTaskMap = new ConcurrentHashMap<>();
+    private static final Map<String, TaskLock> formalTaskMap = new HashMap<>();
 
     // 试评任务并发处理互斥锁
-    private static Map<String, TaskLock> trialTaskMap = new ConcurrentHashMap<>();
+    private static final Map<String, TaskLock> trialTaskMap = new HashMap<>();
 
     public static void clearTimeoutTask(long timeoutMinute) {
-        synchronized (TaskLockUtil.class) {
-            if (formalTaskMap.size() > 0) {
-                for (String key : formalTaskMap.keySet()) {
-                    TaskLock taskLock = formalTaskMap.get(key);
-                    if (taskLock != null) {
-                        taskLock.expire(timeoutMinute);
-                    }
-                }
-            }
-            if (trialTaskMap.size() > 0) {
-                for (String key : trialTaskMap.keySet()) {
-                    TaskLock taskLock = trialTaskMap.get(key);
-                    if (taskLock != null) {
-                        taskLock.expire(timeoutMinute);
-                    }
-                }
-            }
+        for (TaskLock taskLock : trialTaskMap.values()) {
+            taskLock.expire(timeoutMinute);
+        }
+        for (TaskLock taskLock : formalTaskMap.values()) {
+            taskLock.expire(timeoutMinute);
         }
     }
 
     public static TaskLock getTrialTask(String key) {
-        synchronized (TaskLockUtil.class) {
-            TaskLock taskLock = trialTaskMap.get(key);
-            if (taskLock == null) {
-                taskLock = new TaskLock();
-                trialTaskMap.put(key, taskLock);
+        TaskLock taskLock = trialTaskMap.get(key);
+        if (taskLock == null) {
+            synchronized (trialTaskMap) {
+                taskLock = trialTaskMap.computeIfAbsent(key, k -> new TaskLock());
             }
-            return taskLock;
         }
+        return taskLock;
     }
 
     public static TaskLock getFormalTask(String key) {
-        synchronized (TaskLockUtil.class) {
-            TaskLock taskLock = formalTaskMap.get(key);
-            if (taskLock == null) {
-                taskLock = new TaskLock();
-                formalTaskMap.put(key, taskLock);
+        TaskLock taskLock = formalTaskMap.get(key);
+        if (taskLock == null) {
+            synchronized (formalTaskMap) {
+                taskLock = formalTaskMap.computeIfAbsent(key, k -> new TaskLock());
             }
-            return taskLock;
         }
+        return taskLock;
     }
 
 }

+ 0 - 206
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/utils/TrialTaskUtil.java

@@ -1,206 +0,0 @@
-package cn.com.qmth.stmms.biz.utils;
-
-import java.text.ParseException;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Set;
-
-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;
-
-/**
- * Redis zset替代方案,单JVM内部针对已领取未给分<strong>试评</strong>任务的内存锁
- * 
- * @author luoshi
- * 
- */
-public class TrialTaskUtil {
-
-    private static SetMultimap<String, TaskEntry> taskMap = HashMultimap.create();
-
-    /**
-     * 尝试领取某个任务
-     * 
-     * @param marker
-     * @param taskId
-     * @return
-     */
-    public static boolean add(Marker marker, String taskId) {
-        String key = getKey(marker);
-        TaskEntry obj = new TaskEntry(marker.getId(), taskId);
-
-        synchronized (TrialTaskUtil.class) {
-            if (taskMap.containsEntry(key, obj)) {
-                return false;
-            } else {
-                taskMap.put(key, obj);
-                return true;
-            }
-        }
-    }
-
-    /**
-     * 是否已领取某个任务
-     * 
-     * @param marker
-     * @param taskId
-     * @return
-     */
-    public static boolean exists(Marker marker, String taskId) {
-        String key = getKey(marker);
-        Set<TaskEntry> set = taskMap.get(key);
-        if (set != null) {
-            for (TaskEntry entry : set) {
-                if (entry.getTaskId().equals(taskId) && entry.getMarkerId() == marker.getId()) {
-                    return true;
-                }
-            }
-        }
-        return false;
-    }
-
-    /**
-     * 删除某个已完成的任务
-     * 
-     * @param marker
-     * @param taskId
-     */
-    public static void remove(Marker marker, String taskId) {
-        TaskEntry obj = new TaskEntry(marker.getId(), taskId);
-        synchronized (TrialTaskUtil.class) {
-            taskMap.remove(getKey(marker), obj);
-        }
-    }
-
-    /**
-     * 某个科目已领取未给分的任务总数
-     * 
-     * @param examId
-     * @param subjectCode
-     * @return
-     */
-    public static int count(int examId, String subjectCode, int number) {
-        Set<TaskEntry> set = taskMap.get(getKey(examId, subjectCode, number));
-        return set != null ? set.size() : 0;
-    }
-
-    /**
-     * 某个评卷员已领取未给分的任务总数
-     * 
-     * @param marker
-     * @return
-     */
-    public static int count(Marker marker) {
-        Set<TaskEntry> set = taskMap.get(getKey(marker));
-        int count = 0;
-        if (set != null) {
-            for (TaskEntry obj : set) {
-                if (obj.getMarkerId() == marker.getId()) {
-                    count++;
-                }
-            }
-        }
-        return count;
-    }
-
-    /**
-     * 清除某个科目已领取未给分的任务
-     * 
-     * @param examId
-     * @param subjectCode
-     */
-    public static void clear(int examId, String subjectCode, int number) {
-        synchronized (TrialTaskUtil.class) {
-            taskMap.removeAll(getKey(examId, subjectCode, number));
-        }
-    }
-
-    /**
-     * 清除某个评卷员已领取未给分的任务
-     * 
-     * @param marker
-     */
-    public static void clear(Marker marker) {
-        String key = getKey(marker);
-        Set<TaskEntry> set = new HashSet<TaskEntry>();
-        synchronized (TrialTaskUtil.class) {
-            set.addAll(taskMap.get(key));
-            for (TaskEntry obj : set) {
-                if (obj.getMarkerId() == marker.getId()) {
-                    taskMap.remove(key, obj);
-                }
-            }
-        }
-    }
-
-    /**
-     * 获取当前已领取的任务快照
-     * 
-     * @param examId
-     * @param subjectCode
-     * @param groupNumber
-     */
-    public static Set<TaskEntry> list(Integer examId, String subjectCode, Integer groupNumber) {
-        return taskMap.get(getKey(examId, subjectCode, groupNumber));
-    }
-
-    private static String getKey(int examId, String subjectCode, int number) {
-        return examId + "_" + subjectCode + "_" + number;
-    }
-
-    private static String getKey(Marker marker) {
-        return getKey(marker.getExamId(), marker.getSubjectCode(), marker.getGroupNumber());
-    }
-
-    public static void clearTimeoutTask(long timeoutMinute) {
-        synchronized (TrialTaskUtil.class) {
-            SetMultimap<String, TaskEntry> taskMap1 = HashMultimap.create();
-            // System.out.println("任务池大小:"+taskMap.size());
-            // System.out.println("间隔时间:"+cleanMapinterval);
-            if (taskMap.size() > 0) {
-                Multiset<String> keysTemp = taskMap.keys();
-                Set<String> setKey = new HashSet<String>();
-                for (String key : keysTemp) {
-                    setKey.add(key);
-                }
-                for (String key : setKey) {
-                    Set<TaskEntry> set = taskMap.get(key);
-                    if (set != null) {
-                        for (TaskEntry obj : set) {
-                            if (getDateDifference(obj.getTimestamp()) >= timeoutMinute) {// 如果相隔时间超过阀值,则该试卷的放入清空池中
-                                taskMap1.put(key, obj);
-                            }
-                        }
-                    }
-                }
-            }
-            for (Map.Entry<String, TaskEntry> taskEntry : taskMap1.entries()) {
-                taskMap.remove(taskEntry.getKey(), taskEntry.getValue());
-            }
-            taskMap1.clear();
-        }
-    }
-
-    /**
-     * 获取当前时间戳
-     * 
-     * @return
-     * @throws ParseException
-     */
-    public static Long getDateString() {
-        return System.currentTimeMillis();
-    }
-
-    /**
-     * 时间戳相隔分钟
-     * 
-     * @return
-     * @throws ParseException
-     */
-    public static Long getDateDifference(Long oldTime) {
-        return (getDateString() - oldTime) / (1000 * 60);
-    }
-}

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

@@ -399,7 +399,7 @@ public class MarkController extends BaseController {
             long classCount = markerClassService.countByUserIdAndExamId(marker.getUserId(), marker.getExamId());
             list = libraryService
                     .findUnMarked(marker.getExamId(), marker.getSubjectCode(), marker.getGroupNumber(), marker.getId(),
-                            marker.getUserId(), classCount > 0, retry, 20);
+                            marker.getUserId(), classCount > 0, retry, 1);
             if (list.isEmpty()) {
                 break;
             }