Parcourir la source

增加redis锁

wangliang il y a 10 mois
Parent
commit
f1eba31bcb

+ 22 - 4
distributed-print/src/main/java/com/qmth/distributed/print/api/obe/TRBasicInfoController.java

@@ -28,6 +28,8 @@ import com.qmth.teachcloud.common.service.CommonCacheService;
 import com.qmth.teachcloud.common.service.FileUploadService;
 import com.qmth.teachcloud.common.util.*;
 import com.qmth.teachcloud.mark.entity.MarkPaper;
+import com.qmth.teachcloud.mark.enums.LockType;
+import com.qmth.teachcloud.mark.lock.impl.CustomRedisLockProvider;
 import com.qmth.teachcloud.obe.been.dto.CourseWeightDetailDto;
 import com.qmth.teachcloud.obe.been.dto.CourseWeightDto;
 import com.qmth.teachcloud.obe.been.dto.TCUsualScoreDto;
@@ -458,15 +460,31 @@ public class TRBasicInfoController {
     @Resource
     WordToPdfUtil wordToPdfUtil;
 
+    @Resource
+    CustomRedisLockProvider customRedisLockProvider;
+
     @ApiOperation(value = "wordtopdf测试")
     @RequestMapping(value = "/wordTopdf", method = RequestMethod.POST)
     @ApiResponses({@ApiResponse(code = 200, message = "转换成功", response = Object.class)})
     @Aac(auth = false)
     public Result wordTopdfTest() throws Exception {
-        wordToPdfUtil.wordToPdf("/Users/king/Downloads/测试学校_1_2021~2022第一学期_上学期《电力电子与电力传动》_课程目标达成度.docx", "/Users/king/Downloads/测试学校_1_2021~2022第一学期_上学期《电力电子与电力传动》_课程目标达成度.pdf", 0);
-        File file = new File("/Users/king/Downloads/测试学校_1_2021~2022第一学期_上学期《电力电子与电力传动》_课程目标达成度.pdf");
-//        PdfUtil.addWaterMarkFullScreen(file, new String[]{"启明泰和_课程目标达成度测试水印"});
-        PdfUtil.waterMark(file, "启明泰和_课程目标达成度测试水印", "123");
+        if (customRedisLockProvider.tryLock(LockType.CREATE_PDF, "1")) {
+            try {
+                if (!customRedisLockProvider.isLocked(LockType.CREATE_PDF, "1")) {
+                    customRedisLockProvider.waitLock(LockType.CREATE_PDF, "1");
+                }
+                customRedisLockProvider.watch(LockType.CREATE_PDF, "1");
+                customRedisLockProvider.watch(LockType.CREATE_PDF, "1");
+                wordToPdfUtil.wordToPdf("/Users/king/Downloads/测试学校_1_2021~2022第一学期_上学期《电力电子与电力传动》_课程目标达成度.docx", "/Users/king/Downloads/测试学校_1_2021~2022第一学期_上学期《电力电子与电力传动》_课程目标达成度.pdf", 0);
+                File file = new File("/Users/king/Downloads/测试学校_1_2021~2022第一学期_上学期《电力电子与电力传动》_课程目标达成度.pdf");
+//                PdfUtil.addWaterMarkFullScreen(file, new String[]{"启明泰和_课程目标达成度测试水印"});
+                PdfUtil.waterMark(file, "启明泰和_课程目标达成度测试水印", "123");
+            } finally {
+                customRedisLockProvider.unlock(LockType.CREATE_PDF, "1");
+                customRedisLockProvider.unwatch(LockType.CREATE_PDF, "1");
+                customRedisLockProvider.unwatch(LockType.CREATE_PDF, "1");
+            }
+        }
         return ResultUtil.ok(true);
     }
 }

+ 1 - 0
teachcloud-common/src/main/java/com/qmth/teachcloud/common/contant/SystemConstant.java

@@ -552,6 +552,7 @@ public class SystemConstant {
     public static final long REDIS_PAPER_STRUCT_TIME_OUT = 60L * 10;
     public static final long REDIS_LOCK_OBE_RADAR_DATA_TIME_OUT = 60L * 10;
     public static final long REDIS_COURSE_DEGREE_DATA_TIME_OUT = 60L * 10;
+    public static final long REDIS_LOCK_DEFAULT_TIME_OUT = 60L * 2;//请求超时
     /**
      * 机器心跳
      */

+ 81 - 0
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/lock/impl/CustomRedisLockProvider.java

@@ -0,0 +1,81 @@
+package com.qmth.teachcloud.mark.lock.impl;
+
+import com.qmth.teachcloud.common.contant.SystemConstant;
+import com.qmth.teachcloud.common.util.RedisUtil;
+import com.qmth.teachcloud.mark.enums.LockType;
+import com.qmth.teachcloud.mark.lock.LockProvider;
+import org.redisson.api.RReadWriteLock;
+import org.redisson.api.RedissonClient;
+import org.springframework.stereotype.Component;
+import org.springframework.util.CollectionUtils;
+
+import javax.annotation.Resource;
+import java.util.Set;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * 自己实现的内存锁控制
+ *
+ * @author luoshi
+ */
+@Component("customRedisLockProvider")
+public class CustomRedisLockProvider implements LockProvider {
+
+    @Resource
+    RedisUtil redisUtil;
+
+    @Resource
+    RedissonClient redissonClient;
+
+    @Override
+    public void waitLock(LockType type, String key) {
+        getLock(type, key).writeLock().lock(SystemConstant.REDIS_LOCK_DEFAULT_TIME_OUT, TimeUnit.SECONDS);
+    }
+
+    @Override
+    public boolean tryLock(LockType type, String key) {
+        try {
+            return getLock(type, key).writeLock().tryLock(30L, SystemConstant.REDIS_LOCK_DEFAULT_TIME_OUT, TimeUnit.SECONDS);
+        } catch (InterruptedException e) {
+            e.printStackTrace();
+        }
+        return false;
+    }
+
+    @Override
+    public boolean isLocked(LockType type, String key) {
+        return getLock(type, key).writeLock().isLocked();
+    }
+
+    @Override
+    public void unlock(LockType type, String key) {
+        getLock(type, key).writeLock().unlock();
+    }
+
+    @Override
+    public void watch(LockType type, String key) {
+        getLock(type, key).readLock().lock(SystemConstant.REDIS_LOCK_DEFAULT_TIME_OUT, TimeUnit.SECONDS);
+    }
+
+    @Override
+    public void unwatch(LockType type, String key) {
+        getLock(type, key).readLock().unlock();
+    }
+
+    private RReadWriteLock getLock(LockType type, String key) {
+        return redissonClient.getReadWriteLock(type.name() + ":" + key);
+    }
+
+    @Override
+    public void clear() {
+        LockType[] lockTypes = LockType.values();
+        for (LockType lockType : lockTypes) {
+            Set<String> keySet = (Set<String>) redisUtil.getKeyPatterns(lockType.name() + ":*");
+            if (!CollectionUtils.isEmpty(keySet)) {
+                for (String s : keySet) {
+                    redisUtil.delete(s);
+                }
+            }
+        }
+    }
+}