Bläddra i källkod

优化注解锁

周浩 9 år sedan
förälder
incheckning
a75fab58dd

+ 16 - 0
hsweb-web-concurrent/hsweb-web-concurrent-lock/src/main/java/org/hsweb/concurrent/lock/exception/LockException.java

@@ -0,0 +1,16 @@
+package org.hsweb.concurrent.lock.exception;
+
+import org.hsweb.web.core.exception.BusinessException;
+
+/**
+ * Created by zhouhao on 16-5-14.
+ */
+public class LockException extends RuntimeException {
+    public LockException(String message) {
+        super(message);
+    }
+
+    public LockException(String message, Throwable cause) {
+        super(message, cause);
+    }
+}

+ 20 - 10
hsweb-web-concurrent/hsweb-web-concurrent-lock/src/main/java/org/hsweb/concurrent/lock/support/AnnotationLockAopAdvice.java

@@ -6,6 +6,7 @@ import org.aspectj.lang.annotation.Aspect;
 import org.aspectj.lang.reflect.MethodSignature;
 import org.hsweb.concurrent.lock.LockFactory;
 import org.hsweb.concurrent.lock.annotation.LockName;
+import org.hsweb.concurrent.lock.exception.LockException;
 import org.hsweb.web.core.authorize.ExpressionScopeBean;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -48,11 +49,12 @@ public class AnnotationLockAopAdvice {
             }
         }
         try {
-            logger.debug("try lock :" , name);
-            _lock.tryLock(lock.waitTime(), lock.timeUnit());
+            logger.debug("try lock :", name);
+            boolean locked = _lock.tryLock(lock.waitTime(), lock.timeUnit());
+            if (!locked) throw new LockException(name + "error");
             return pjp.proceed();
         } finally {
-            logger.debug("unlock :" , name);
+            logger.debug("unlock :", name);
             unlock(_lock);
         }
     }
@@ -69,11 +71,12 @@ public class AnnotationLockAopAdvice {
         }
         Lock readLock = readWriteLock.readLock();
         try {
-            logger.debug("try lock :{} " , name);
-            readLock.tryLock(lock.waitTime(), lock.timeUnit());
+            logger.debug("try readLock :{} ", name);
+            boolean locked = readLock.tryLock(lock.waitTime(), lock.timeUnit());
+            if (!locked) throw new LockException(name + "error");
             return pjp.proceed();
         } finally {
-            logger.debug("unlock :{} " , name);
+            logger.debug("unlock readLock :{} ", name);
             unlock(readLock);
         }
     }
@@ -90,11 +93,12 @@ public class AnnotationLockAopAdvice {
         }
         Lock writeLock = readWriteLock.writeLock();
         try {
-            logger.debug("try lock :{} " , name);
-            writeLock.tryLock(lock.waitTime(), lock.timeUnit());
+            logger.debug("try writeLock :{} ", name);
+            boolean locked = writeLock.tryLock(lock.waitTime(), lock.timeUnit());
+            if (!locked) throw new LockException(name + "error");
             return pjp.proceed();
         } finally {
-            logger.debug("unlock :{} " , name);
+            logger.debug("unlock writeLock:{} ", name);
             unlock(writeLock);
         }
     }
@@ -134,7 +138,13 @@ public class AnnotationLockAopAdvice {
     }
 
     private void unlock(Lock lock) {
-        if (lock != null) lock.unlock();
+        if (lock != null) {
+            try {
+                lock.unlock();
+            } catch (Throwable e) {
+                logger.error("unlock error",e);
+            }
+        }
     }
 
 }

+ 7 - 2
hsweb-web-service-impl-common/src/main/java/org/hsweb/web/service/impl/form/DynamicFormServiceImpl.java

@@ -18,6 +18,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.util.Assert;
 import org.webbuilder.sql.*;
+import org.webbuilder.sql.exception.CreateException;
 import org.webbuilder.sql.param.ExecuteCondition;
 
 import javax.annotation.PostConstruct;
@@ -99,7 +100,11 @@ public class DynamicFormServiceImpl implements DynamicFormService {
         History history = historyService.selectLastHistoryByType("form.deploy." + form.getName());
         //首次部署
         if (history == null) {
-            dataBase.createTable(metaData);
+            try {
+                dataBase.createTable(metaData);
+            } catch (CreateException e) {
+                dataBase.updateTable(metaData);
+            }
         } else {
             Form lastDeploy = JSON.parseObject(history.getChange_after(), Form.class);
             TableMetaData lastDeployMetaData = formParser.parse(lastDeploy);
@@ -227,7 +232,7 @@ public class DynamicFormServiceImpl implements DynamicFormService {
 
     @Override
     @ReadLock
-    @LockName(value = "'form.lock.'+#tableName", isExpression = true)
+    @LockName(value = "'form.lock.'+#name", isExpression = true)
     public <T> T selectByPk(String name, Object pk) throws Exception {
         Table table = getTableByName(name);
         Query query = table.createQuery();