diff --git a/caf-lock/caf-lock-api/src/main/java/io/iec/edp/caf/lock/service/api/api/LockExtension.java b/caf-lock/caf-lock-api/src/main/java/io/iec/edp/caf/lock/service/api/api/LockExtension.java index b43e37b94abc6f9a28ef0c385bd16bbdb8a8e8d6..3907326facb3b29dc6217b2b2a1e1abdeeec4879 100644 --- a/caf-lock/caf-lock-api/src/main/java/io/iec/edp/caf/lock/service/api/api/LockExtension.java +++ b/caf-lock/caf-lock-api/src/main/java/io/iec/edp/caf/lock/service/api/api/LockExtension.java @@ -47,6 +47,14 @@ public interface LockExtension { */ boolean removeSessionLock(String sessionId, int tenantId); + /** + * 解除所有分布式事务编号为distributedTransactionId的锁 + * @param distributedTransactionId 锁对应的分布式事务编号,区别于当前事务号 + * @param tenantId 租户编号 + * @return 是否清除成功,true:表示成功 false:表示失败 + */ + boolean removeDistributedTransactionLock(String distributedTransactionId, int tenantId); + /** * 批量解锁 * @param groupId 锁批量编号 diff --git a/caf-lock/caf-lock-api/src/main/java/io/iec/edp/caf/lock/service/api/api/LockService.java b/caf-lock/caf-lock-api/src/main/java/io/iec/edp/caf/lock/service/api/api/LockService.java index e6214ce84d95c01bb0720e2a2bc18875c4154351..e02ef8a8c622aea18fe79cf9cba24f63c45d8d5b 100644 --- a/caf-lock/caf-lock-api/src/main/java/io/iec/edp/caf/lock/service/api/api/LockService.java +++ b/caf-lock/caf-lock-api/src/main/java/io/iec/edp/caf/lock/service/api/api/LockService.java @@ -130,6 +130,14 @@ public interface LockService { */ boolean removeSessionLock(String sessionId, int tenantId); + /** + * 解除所有分布式事务编号为distributedTransactionId的锁 + * @param distributedTransactionId 锁对应的分布式事务编号,区别于当前事务号 + * @param tenantId 租户编号 + * @return 是否清除成功,true:表示成功 false:表示失败 + */ + boolean removeDistributedTransactionLock(String distributedTransactionId, int tenantId); + /** * 批量解锁 * @param groupId 锁批量编号 diff --git a/caf-lock/caf-lock-api/src/main/java/io/iec/edp/caf/lock/service/api/exception/DLErrorDefinition.java b/caf-lock/caf-lock-api/src/main/java/io/iec/edp/caf/lock/service/api/exception/DLErrorDefinition.java index 53efa314dc6ce8cf13458e3ca44cbc867c1ae3f8..c95bfb6799aaf840160796e6c57965e036f09c08 100644 --- a/caf-lock/caf-lock-api/src/main/java/io/iec/edp/caf/lock/service/api/exception/DLErrorDefinition.java +++ b/caf-lock/caf-lock-api/src/main/java/io/iec/edp/caf/lock/service/api/exception/DLErrorDefinition.java @@ -75,5 +75,10 @@ public class DLErrorDefinition { public static final String Param_Is_Null="GSP_Svc_DistributedLock_1011"; public static final String AddBatchLock_Error="GSP_Svc_DistributedLock_1012"; + /** + * 根据distributedTransactionId删锁时报错 + */ + public static final String RemLock_DistributedTransactionId_Error = "Gsp_Svc_DistributedLock_1013"; + } diff --git a/caf-lock/caf-lock-api/src/main/java/io/iec/edp/caf/lock/service/api/repositories/LockRepo.java b/caf-lock/caf-lock-api/src/main/java/io/iec/edp/caf/lock/service/api/repositories/LockRepo.java index 2be48398a93633313dcdae1f1696228ae61222b5..65899eb472c9c789062b5d8b021987ed387bf90a 100644 --- a/caf-lock/caf-lock-api/src/main/java/io/iec/edp/caf/lock/service/api/repositories/LockRepo.java +++ b/caf-lock/caf-lock-api/src/main/java/io/iec/edp/caf/lock/service/api/repositories/LockRepo.java @@ -40,6 +40,8 @@ public interface LockRepo extends JpaRepository { void deleteBySessionId(String sessionId); + void deleteByDistributedTransactionId(String distributedTransactionId); + List findByMkIdAndCategoryId(String mkId, String categoryId); List findByMkIdAndCategoryIdAndSuName(String mkId, String categoryId,String su); diff --git a/caf-lock/caf-lock-api/src/main/java/io/iec/edp/caf/lock/service/spi/DistributedTransactionLock.java b/caf-lock/caf-lock-api/src/main/java/io/iec/edp/caf/lock/service/spi/DistributedTransactionLock.java new file mode 100644 index 0000000000000000000000000000000000000000..a3751e8f5348120e24707a34066b450f24d4a085 --- /dev/null +++ b/caf-lock/caf-lock-api/src/main/java/io/iec/edp/caf/lock/service/spi/DistributedTransactionLock.java @@ -0,0 +1,8 @@ +package io.iec.edp.caf.lock.service.spi; + +public interface DistributedTransactionLock { + + public String getDistributedTransactionId(); + + public boolean isDistributedTransactionNotValid(String distributedTransactionId); +} diff --git a/caf-lock/caf-lock-api/src/main/java/io/iec/edp/caf/lock/service/spi/utils/DistributedTransactionLockResolver.java b/caf-lock/caf-lock-api/src/main/java/io/iec/edp/caf/lock/service/spi/utils/DistributedTransactionLockResolver.java new file mode 100644 index 0000000000000000000000000000000000000000..58e4c8d7791f431c7d226a81d5ecd72cbef68390 --- /dev/null +++ b/caf-lock/caf-lock-api/src/main/java/io/iec/edp/caf/lock/service/spi/utils/DistributedTransactionLockResolver.java @@ -0,0 +1,41 @@ +package io.iec.edp.caf.lock.service.spi.utils; + +import io.iec.edp.caf.commons.ApplicationClassLoaderManager; +import io.iec.edp.caf.lock.service.spi.DistributedTransactionLock; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.ServiceLoader; + +public class DistributedTransactionLockResolver { + + private static List distributedTransactionLockList = new ArrayList<>(); + + static { + ServiceLoader DistributedTransactionLockService = ServiceLoader.load(DistributedTransactionLock.class, ApplicationClassLoaderManager.getServiceClassLoader()); + Iterator iterator = DistributedTransactionLockService.iterator(); + while (iterator.hasNext()) { + DistributedTransactionLock service = iterator.next(); + distributedTransactionLockList.add(service); + } + } + + public static String getDistributedTransactionId(){ + String distributedTransactionId = ""; + if(distributedTransactionLockList !=null&& distributedTransactionLockList.size()>0){ + distributedTransactionId = distributedTransactionLockList.get(0).getDistributedTransactionId();//默认只有1个扩展 + } + return distributedTransactionId; + } + + public static boolean isDistributedTransactionNotValid(String distributedTransactionId){ + boolean distributedTransactionNotValid = false; + if(distributedTransactionLockList !=null&& distributedTransactionLockList.size()>0){ + distributedTransactionNotValid = distributedTransactionLockList.get(0).isDistributedTransactionNotValid(distributedTransactionId);//默认只有1个扩展 + } + return distributedTransactionNotValid; + } + + +} diff --git a/caf-lock/caf-lock-api/src/main/java/io/iec/edp/caf/lockservice/api/BatchLockEntity.java b/caf-lock/caf-lock-api/src/main/java/io/iec/edp/caf/lockservice/api/BatchLockEntity.java index fefb61bcef0ea04dcdfe879122995448ef87156e..01454a8f3e5fde43073074160e949db8ddd7c455 100644 --- a/caf-lock/caf-lock-api/src/main/java/io/iec/edp/caf/lockservice/api/BatchLockEntity.java +++ b/caf-lock/caf-lock-api/src/main/java/io/iec/edp/caf/lockservice/api/BatchLockEntity.java @@ -101,4 +101,9 @@ public BatchLockEntity(){} * su名称 */ private String suName; + + /** + * 分布式事务的编号 + */ + private String distributedTransactionId; } diff --git a/caf-lock/caf-lock-api/src/main/java/io/iec/edp/caf/lockservice/api/LockEntity.java b/caf-lock/caf-lock-api/src/main/java/io/iec/edp/caf/lockservice/api/LockEntity.java index c12f4ee856ce3fda535a8bf04922cafc8f597279..75a5b548ebc06b669c9086cded1600555f25a95e 100644 --- a/caf-lock/caf-lock-api/src/main/java/io/iec/edp/caf/lockservice/api/LockEntity.java +++ b/caf-lock/caf-lock-api/src/main/java/io/iec/edp/caf/lockservice/api/LockEntity.java @@ -111,4 +111,9 @@ public class LockEntity { * su名称 */ private String suName; + + /** + * 分布式事务的编号 + */ + private String distributedTransactionId; } diff --git a/caf-lock/caf-lock-api/src/main/java/io/iec/edp/caf/lockservice/api/LockedScope.java b/caf-lock/caf-lock-api/src/main/java/io/iec/edp/caf/lockservice/api/LockedScope.java index 5e35b515bb9cd8512b2f0d2ed768488b577a629b..e9e02000b7b28071191af8199b7bfdd161bc7cbb 100644 --- a/caf-lock/caf-lock-api/src/main/java/io/iec/edp/caf/lockservice/api/LockedScope.java +++ b/caf-lock/caf-lock-api/src/main/java/io/iec/edp/caf/lockservice/api/LockedScope.java @@ -32,7 +32,10 @@ public enum LockedScope { AppInstance(1), /** 功能上下文级的作用域。*/ - BizContext(2); + BizContext(2), + + /** 分布式事务级的作用域。*/ + DistributedTransaction(3); /*value值*/ private int value = 0; diff --git a/caf-lock/caf-lock-extension-jpa/src/main/java/io/iec/edp/caf/lock/extension/jpa/JpaLockExtensionImpl.java b/caf-lock/caf-lock-extension-jpa/src/main/java/io/iec/edp/caf/lock/extension/jpa/JpaLockExtensionImpl.java index 96caafb432a532187e8946f914d758e733b9a47a..4469754bd37925b859c83638e6bf6df82dc9cc09 100644 --- a/caf-lock/caf-lock-extension-jpa/src/main/java/io/iec/edp/caf/lock/extension/jpa/JpaLockExtensionImpl.java +++ b/caf-lock/caf-lock-extension-jpa/src/main/java/io/iec/edp/caf/lock/extension/jpa/JpaLockExtensionImpl.java @@ -30,6 +30,7 @@ import io.iec.edp.caf.lock.service.api.exception.DLErrorDefinition; import io.iec.edp.caf.lock.service.api.repositories.BatchLockRepo; import io.iec.edp.caf.lock.service.api.repositories.LockRepo; import io.iec.edp.caf.lock.service.api.utils.DataValidator; +import io.iec.edp.caf.lock.service.spi.utils.DistributedTransactionLockResolver; import io.iec.edp.caf.lock.service.spi.utils.LockValidateResolverUtils; import io.iec.edp.caf.lockservice.api.*; import lombok.extern.slf4j.Slf4j; @@ -340,6 +341,22 @@ public class JpaLockExtensionImpl implements LockExtension { } } + @Override + public boolean removeDistributedTransactionLock(String distributedTransactionId, int tenantId) { + DataValidator.checkForEmptyString(distributedTransactionId, "distributedTransactionId"); + JpaTransaction tran = JpaTransaction.getTransaction(); + try { + tran.begin(TransactionPropagation.REQUIRES_NEW); + this.repo.deleteByDistributedTransactionId(distributedTransactionId); + tran.commit(); + return true; + } catch (Throwable ex) + { + tran.rollback(); + throw new io.iec.edp.caf.lock.service.api.exception.DistributedLockException("caf", DLErrorDefinition.RemLock_DistributedTransactionId_Error,"removeLockError",ex, ExceptionLevel.Error,false); + } + } + @Override public boolean removeBatchLock(String groupId){ @@ -406,12 +423,14 @@ public class JpaLockExtensionImpl implements LockExtension { String contextId ="";// this.contextService.getContextId(); String userId=""; String currentSU=""; + String distributedTransactionId=""; if(contextInfo!=null){ sessionId=contextInfo.getSessionId(); contextId=contextInfo.getContextId(); userId=contextInfo.getUserId(); currentSU=contextInfo.getCurrentSU(); } + distributedTransactionId= DistributedTransactionLockResolver.getDistributedTransactionId(); for (var dataId : dataIds) { var entity = new BatchLockEntity(); entity.setId(UUID.randomUUID().toString()); @@ -427,6 +446,7 @@ public class JpaLockExtensionImpl implements LockExtension { entity.setLockTime(lockTime); entity.setUserId(userId); entity.setSuName(currentSU); + entity.setDistributedTransactionId(distributedTransactionId); entities.add(entity); } return entities; @@ -491,12 +511,15 @@ public class JpaLockExtensionImpl implements LockExtension { String contextId=""; String currentSU=""; String userId=""; + String distributedTransactionId=""; if(contextInfo!=null){ sessionId=contextInfo.getSessionId(); contextId=contextInfo.getContextId(); currentSU=contextInfo.getCurrentSU(); userId=contextInfo.getUserId(); } + //获取distributedTransactionId的相关代码 + distributedTransactionId= DistributedTransactionLockResolver.getDistributedTransactionId(); var entity = new LockEntity(); // entity.setId(lockId); entity.setMkId(mkId); @@ -512,6 +535,7 @@ public class JpaLockExtensionImpl implements LockExtension { entity.setUserId(userId); entity.setLockTime(OffsetDateTime.now()); entity.setSuName(currentSU); + entity.setDistributedTransactionId(distributedTransactionId); return entity; } @@ -544,12 +568,16 @@ public class JpaLockExtensionImpl implements LockExtension { //3 根据范围(LockedScope)判断是否有效 String locksessionId = lockEntity.getSessionId(); String contextId = lockEntity.getContextId(); + String distributedTransactionId = lockEntity.getDistributedTransactionId(); String currentsessionId ="";// this.contextService.getSessionId(); String currentContextId ="";// this.contextService.getContextId(); + String currentDistributedTransactionId = ""; if(contextInfo!=null){ currentsessionId=contextInfo.getSessionId(); currentContextId=contextInfo.getContextId(); } + //获取distributedTransactionId的相关代码 + currentDistributedTransactionId= DistributedTransactionLockResolver.getDistributedTransactionId(); switch (lockEntity.getLockedScope()) { case AppInstance: // 表示实例锁有效,需要近一步检查 result = LockStatus.Replaceable; @@ -581,6 +609,12 @@ public class JpaLockExtensionImpl implements LockExtension { } result = LockStatus.Replaceable; break; + case DistributedTransaction: + if (!distributedTransactionId.equals(currentDistributedTransactionId) && this.isDistributedTransactionNotValid(distributedTransactionId)) { + return LockStatus.Invalid; + } + result = LockStatus.Replaceable; + break; default: result = LockStatus.Invalid; break; @@ -645,6 +679,11 @@ public class JpaLockExtensionImpl implements LockExtension { } + private boolean isDistributedTransactionNotValid(String distributedTransactionId) { + return DistributedTransactionLockResolver.isDistributedTransactionNotValid(distributedTransactionId); + } + + private boolean tryRemoveLock(Throwable e){ if(e==null){ return false; diff --git a/caf-lock/caf-lock-memory/src/main/java/io/iec/edp/caf/lock/service/memory/MemoryLockServiceImpl.java b/caf-lock/caf-lock-memory/src/main/java/io/iec/edp/caf/lock/service/memory/MemoryLockServiceImpl.java index 7f231a57bb4c85bfa2b0f97165edc44e5019a5ae..71843cf2a7bca86759aed4a29249d9635b1141e5 100644 --- a/caf-lock/caf-lock-memory/src/main/java/io/iec/edp/caf/lock/service/memory/MemoryLockServiceImpl.java +++ b/caf-lock/caf-lock-memory/src/main/java/io/iec/edp/caf/lock/service/memory/MemoryLockServiceImpl.java @@ -192,6 +192,11 @@ public class MemoryLockServiceImpl implements LockService { return lockExtension.removeSessionLock(sessionId,tenantId); } + @Override + public boolean removeDistributedTransactionLock(String distributedTransactionId, int tenantId) { + return lockExtension.removeDistributedTransactionLock(distributedTransactionId,tenantId); + } + @Override public boolean removeBatchLock(String groupId) { return lockExtension.removeBatchLock(groupId); diff --git a/caf-lock/caf-lock-redis/src/main/java/io/iec/edp/caf/lock/service/redis/DistributedLockServiceImpl.java b/caf-lock/caf-lock-redis/src/main/java/io/iec/edp/caf/lock/service/redis/DistributedLockServiceImpl.java index 183197ebb6e799d8ae2a4e0d129a63d77e932209..07371b39014f0a0010fe79a80d13c222deaeb3b3 100644 --- a/caf-lock/caf-lock-redis/src/main/java/io/iec/edp/caf/lock/service/redis/DistributedLockServiceImpl.java +++ b/caf-lock/caf-lock-redis/src/main/java/io/iec/edp/caf/lock/service/redis/DistributedLockServiceImpl.java @@ -207,6 +207,11 @@ public class DistributedLockServiceImpl implements LockService { return lockExtension.removeSessionLock(sessionId,tenantId); } + @Override + public boolean removeDistributedTransactionLock(String distributedTransactionId, int tenantId) { + return lockExtension.removeDistributedTransactionLock(distributedTransactionId,tenantId); + } + @Override public boolean removeBatchLock(String groupId) { return lockExtension.removeBatchLock(groupId);