zhouhao 7 anos atrás
pai
commit
26f15fe4ab

+ 7 - 1
hsweb-concurrent/hsweb-concurrent-lock/hsweb-concurrent-lock-api/pom.xml

@@ -11,5 +11,11 @@
 
     <artifactId>hsweb-concurrent-lock-api</artifactId>
 
-
+    <dependencies>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-test</artifactId>
+            <scope>test</scope>
+        </dependency>
+    </dependencies>
 </project>

+ 0 - 2
hsweb-concurrent/hsweb-concurrent-lock/hsweb-concurrent-lock-api/src/test/java/org/hswebframework/web/concurrent/lok/SimpleLockTests.java

@@ -10,8 +10,6 @@ import java.util.concurrent.locks.ReadWriteLock;
 import java.util.function.Consumer;
 
 /**
- * TODO 完成注释
- *
  * @author zhouhao
  */
 public class SimpleLockTests {

+ 15 - 3
hsweb-concurrent/hsweb-concurrent-lock/hsweb-concurrent-lock-starter/src/main/java/org/hswebframework/web/concurrent/lock/starter/AopLockAdvisor.java

@@ -50,25 +50,37 @@ public class AopLockAdvisor extends StaticMethodMatcherPointcutAdvisor {
                                 .lockNameIs(WriteLock::value)
                                 .lockIs(name -> lockManager.getReadWriteLock(name).writeLock())));
             }
-
+            boolean lockError = false;
             try {
                 for (LockProcessor processor : lockProcessors) {
                     Throwable e = processor.doLock();
                     if (e != null) {
+                        lockError = true;
                         throw e;
                     }
                 }
                 return methodInvocation.proceed();
             } finally {
                 for (LockProcessor processor : lockProcessors) {
-                    processor.doUnlock();
+                    try {
+                        processor.doUnlock();
+                    } catch (Exception e) {
+                        if (!lockError) {
+                            log.error("unlock {} error", methodInvocation.getMethod(), e);
+                        }
+                    }
                 }
             }
         });
     }
 
     protected <A extends Annotation> LockProcessor<A, java.util.concurrent.locks.Lock> initLockInfo(long timeout, TimeUnit timeUnit, LockProcessor<A, java.util.concurrent.locks.Lock> lockProcessor) {
-        return lockProcessor.lock(lock -> lock.tryLock(timeout, timeUnit)).unlock(java.util.concurrent.locks.Lock::unlock).init();
+        return lockProcessor
+                .lock(lock -> lock.tryLock(timeout, timeUnit))
+                .unlock(lock -> {
+                    lock.unlock();
+                    return true;
+                }).init();
     }
 
 

+ 0 - 2
hsweb-concurrent/hsweb-concurrent-lock/hsweb-concurrent-lock-starter/src/main/java/org/hswebframework/web/concurrent/lock/starter/LockManagerAutoConfiguration.java

@@ -9,8 +9,6 @@ import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 
 /**
- * TODO 完成注释
- *
  * @author zhouhao
  */
 @Configuration

+ 6 - 2
hsweb-concurrent/hsweb-concurrent-lock/hsweb-concurrent-lock-starter/src/main/java/org/hswebframework/web/concurrent/lock/starter/LockProcessor.java

@@ -10,6 +10,7 @@ import org.springframework.util.StringUtils;
 
 import java.lang.annotation.Annotation;
 import java.util.*;
+import java.util.concurrent.TimeoutException;
 import java.util.function.Function;
 
 /**
@@ -98,7 +99,10 @@ public class LockProcessor<A extends Annotation, L> {
         Throwable lockError = null;
         for (Map.Entry<String, L> lock : lockStore.entrySet()) {
             try {
-                lockAccepter.accept(lock.getValue());
+                boolean success = lockAccepter.accept(lock.getValue());
+                if (!success) {
+                    return new TimeoutException("try lock " + lock.getKey() + " error");
+                }
                 successLock.add(lock.getValue());
             } catch (Throwable throwable) {
                 lockError = throwable;
@@ -118,7 +122,7 @@ public class LockProcessor<A extends Annotation, L> {
     }
 
     public interface LockAccepter<T> {
-        void accept(T t) throws Throwable;
+        boolean accept(T t) throws Throwable;
     }
 
 }

+ 0 - 1
hsweb-concurrent/hsweb-concurrent-lock/hsweb-concurrent-lock-starter/src/main/java/org/hswebframework/web/concurrent/lock/starter/RedisLockManagerAutoConfiguration.java

@@ -16,7 +16,6 @@ import org.springframework.context.annotation.Configuration;
 @Configuration
 @ConditionalOnClass({RedissonClient.class, RedissonLockManager.class})
 @ConditionalOnBean(RedissonClient.class)
-//@AutoConfigureBefore(LockManagerAutoConfiguration.class)
 public class RedisLockManagerAutoConfiguration {
     @Bean
     public LockManager lockManager(RedissonClient redissonClient) {