diff --git a/orion-visor-framework/orion-visor-framework-common/src/main/java/com/orion/visor/framework/common/lock/Locker.java b/orion-visor-framework/orion-visor-framework-common/src/main/java/com/orion/visor/framework/common/lock/Locker.java new file mode 100644 index 00000000..cb1c4ed9 --- /dev/null +++ b/orion-visor-framework/orion-visor-framework-common/src/main/java/com/orion/visor/framework/common/lock/Locker.java @@ -0,0 +1,33 @@ +package com.orion.visor.framework.common.lock; + +import java.util.function.Supplier; + +/** + * 分布式锁 + * + * @author Jiahang Li + * @version 1.0.0 + * @since 2024/5/16 12:24 + */ +public interface Locker { + + /** + * 尝试获取锁 + * + * @param key key + * @param run run + * @return 是否获取到锁 + */ + boolean tryLock(String key, Runnable run); + + /** + * 尝试获取锁 + * + * @param key key + * @param call call + * @param T + * @return 执行结果 + */ + T tryLock(String key, Supplier call); + +} diff --git a/orion-visor-framework/orion-visor-spring-boot-starter-redis/src/main/java/com/orion/visor/framework/redis/core/utils/RedisLocks.java b/orion-visor-framework/orion-visor-framework-common/src/main/java/com/orion/visor/framework/common/utils/LockerUtils.java similarity index 58% rename from orion-visor-framework/orion-visor-spring-boot-starter-redis/src/main/java/com/orion/visor/framework/redis/core/utils/RedisLocks.java rename to orion-visor-framework/orion-visor-framework-common/src/main/java/com/orion/visor/framework/common/utils/LockerUtils.java index 9d91e49c..db856955 100644 --- a/orion-visor-framework/orion-visor-spring-boot-starter-redis/src/main/java/com/orion/visor/framework/redis/core/utils/RedisLocks.java +++ b/orion-visor-framework/orion-visor-framework-common/src/main/java/com/orion/visor/framework/common/utils/LockerUtils.java @@ -1,24 +1,24 @@ -package com.orion.visor.framework.redis.core.utils; +package com.orion.visor.framework.common.utils; import com.orion.lang.utils.Exceptions; -import com.orion.visor.framework.redis.core.lock.RedisLocker; +import com.orion.visor.framework.common.lock.Locker; import lombok.extern.slf4j.Slf4j; import java.util.function.Supplier; /** - * redis 分布式锁工具类 + * 分布式锁工具类 * * @author Jiahang Li * @version 1.0.0 * @since 2024/4/25 16:42 */ @Slf4j -public class RedisLocks { +public class LockerUtils { - private static RedisLocker redisLocker; + private static Locker delegate; - private RedisLocks() { + private LockerUtils() { } /** @@ -29,7 +29,7 @@ public class RedisLocks { * @return 是否获取到锁 */ public static boolean tryLock(String key, Runnable run) { - return redisLocker.tryLock(key, run); + return delegate.tryLock(key, run); } /** @@ -41,15 +41,15 @@ public class RedisLocks { * @return 执行结果 */ public static T tryLock(String key, Supplier call) { - return redisLocker.tryLock(key, call); + return delegate.tryLock(key, call); } - public static void setRedisLocker(RedisLocker redisLocker) { - if (RedisLocks.redisLocker != null) { + public static void setDelegate(Locker delegate) { + if (LockerUtils.delegate != null) { // unmodified throw Exceptions.state(); } - RedisLocks.redisLocker = redisLocker; + LockerUtils.delegate = delegate; } } diff --git a/orion-visor-framework/orion-visor-spring-boot-starter-mybatis/src/main/resources/templates/orion-server-module-cache-dto.java.vm b/orion-visor-framework/orion-visor-spring-boot-starter-mybatis/src/main/resources/templates/orion-server-module-cache-dto.java.vm index 3d86b457..bbc41dde 100644 --- a/orion-visor-framework/orion-visor-spring-boot-starter-mybatis/src/main/resources/templates/orion-server-module-cache-dto.java.vm +++ b/orion-visor-framework/orion-visor-spring-boot-starter-mybatis/src/main/resources/templates/orion-server-module-cache-dto.java.vm @@ -2,9 +2,12 @@ package ${currentPackage}; import com.orion.lang.define.cache.key.model.LongCacheIdModel; import io.swagger.v3.oas.annotations.media.Schema; -import java.io.Serializable; -import lombok.*; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import java.io.Serializable; import java.util.*; import java.math.*; diff --git a/orion-visor-framework/orion-visor-spring-boot-starter-mybatis/src/main/resources/templates/orion-server-module-entity-vo.java.vm b/orion-visor-framework/orion-visor-spring-boot-starter-mybatis/src/main/resources/templates/orion-server-module-entity-vo.java.vm index acce9e4c..a41c657f 100644 --- a/orion-visor-framework/orion-visor-spring-boot-starter-mybatis/src/main/resources/templates/orion-server-module-entity-vo.java.vm +++ b/orion-visor-framework/orion-visor-spring-boot-starter-mybatis/src/main/resources/templates/orion-server-module-entity-vo.java.vm @@ -1,7 +1,10 @@ package ${currentPackage}; import io.swagger.v3.oas.annotations.media.Schema; -import lombok.*; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; import java.io.Serializable; import java.util.*; diff --git a/orion-visor-framework/orion-visor-spring-boot-starter-mybatis/src/main/resources/templates/orion-server-provider-entity-dto.java.vm b/orion-visor-framework/orion-visor-spring-boot-starter-mybatis/src/main/resources/templates/orion-server-provider-entity-dto.java.vm index 1e43b43d..ddd1927e 100644 --- a/orion-visor-framework/orion-visor-spring-boot-starter-mybatis/src/main/resources/templates/orion-server-provider-entity-dto.java.vm +++ b/orion-visor-framework/orion-visor-spring-boot-starter-mybatis/src/main/resources/templates/orion-server-provider-entity-dto.java.vm @@ -1,9 +1,12 @@ package ${currentPackage}; import io.swagger.v3.oas.annotations.media.Schema; -import java.io.Serializable; -import lombok.*; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import java.io.Serializable; import java.util.*; import java.math.*; diff --git a/orion-visor-framework/orion-visor-spring-boot-starter-mybatis/src/main/resources/templates/orion-vue-views-components-card-list.vue.vm b/orion-visor-framework/orion-visor-spring-boot-starter-mybatis/src/main/resources/templates/orion-vue-views-components-card-list.vue.vm index e3604341..67056dee 100644 --- a/orion-visor-framework/orion-visor-spring-boot-starter-mybatis/src/main/resources/templates/orion-vue-views-components-card-list.vue.vm +++ b/orion-visor-framework/orion-visor-spring-boot-starter-mybatis/src/main/resources/templates/orion-vue-views-components-card-list.vue.vm @@ -60,7 +60,7 @@ #if(${dictMap.containsKey(${field.propertyName})}) #end #end diff --git a/orion-visor-framework/orion-visor-spring-boot-starter-redis/src/main/java/com/orion/visor/framework/redis/configuration/OrionRedisAutoConfiguration.java b/orion-visor-framework/orion-visor-spring-boot-starter-redis/src/main/java/com/orion/visor/framework/redis/configuration/OrionRedisAutoConfiguration.java index d60ad7f0..daaebf39 100644 --- a/orion-visor-framework/orion-visor-spring-boot-starter-redis/src/main/java/com/orion/visor/framework/redis/configuration/OrionRedisAutoConfiguration.java +++ b/orion-visor-framework/orion-visor-spring-boot-starter-redis/src/main/java/com/orion/visor/framework/redis/configuration/OrionRedisAutoConfiguration.java @@ -1,14 +1,16 @@ package com.orion.visor.framework.redis.configuration; import com.orion.visor.framework.common.constant.AutoConfigureOrderConst; +import com.orion.visor.framework.common.lock.Locker; +import com.orion.visor.framework.common.utils.LockerUtils; import com.orion.visor.framework.redis.configuration.config.RedissonConfig; import com.orion.visor.framework.redis.core.lock.RedisLocker; -import com.orion.visor.framework.redis.core.utils.RedisLocks; import com.orion.visor.framework.redis.core.utils.RedisUtils; import org.redisson.api.RedissonClient; import org.redisson.spring.starter.RedissonAutoConfigurationCustomizer; import org.springframework.boot.autoconfigure.AutoConfiguration; import org.springframework.boot.autoconfigure.AutoConfigureOrder; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Lazy; @@ -23,7 +25,7 @@ import org.springframework.data.redis.serializer.RedisSerializer; * @version 1.0.0 * @since 2023/6/28 14:44 */ -@Lazy(value = false) +@Lazy(false) @AutoConfiguration @AutoConfigureOrder(AutoConfigureOrderConst.FRAMEWORK_REDIS) @EnableConfigurationProperties(RedissonConfig.class) @@ -64,9 +66,10 @@ public class OrionRedisAutoConfiguration { * @return redis 分布式锁 */ @Bean - public RedisLocker redisLocker(RedissonClient redissonClient) { + @ConditionalOnMissingBean + public Locker redisLocker(RedissonClient redissonClient) { RedisLocker redisLocker = new RedisLocker(redissonClient); - RedisLocks.setRedisLocker(redisLocker); + LockerUtils.setDelegate(redisLocker); return redisLocker; } diff --git a/orion-visor-framework/orion-visor-spring-boot-starter-redis/src/main/java/com/orion/visor/framework/redis/configuration/config/RedissonConfig.java b/orion-visor-framework/orion-visor-spring-boot-starter-redis/src/main/java/com/orion/visor/framework/redis/configuration/config/RedissonConfig.java index 85626fff..a9f03522 100644 --- a/orion-visor-framework/orion-visor-spring-boot-starter-redis/src/main/java/com/orion/visor/framework/redis/configuration/config/RedissonConfig.java +++ b/orion-visor-framework/orion-visor-spring-boot-starter-redis/src/main/java/com/orion/visor/framework/redis/configuration/config/RedissonConfig.java @@ -24,4 +24,9 @@ public class RedissonConfig { */ private Integer nettyThreads; + public RedissonConfig() { + this.threads = 16; + this.nettyThreads = 16; + } + } diff --git a/orion-visor-framework/orion-visor-spring-boot-starter-redis/src/main/java/com/orion/visor/framework/redis/core/lock/RedisLocker.java b/orion-visor-framework/orion-visor-spring-boot-starter-redis/src/main/java/com/orion/visor/framework/redis/core/lock/RedisLocker.java index 5c9fe596..ac8334a4 100644 --- a/orion-visor-framework/orion-visor-spring-boot-starter-redis/src/main/java/com/orion/visor/framework/redis/core/lock/RedisLocker.java +++ b/orion-visor-framework/orion-visor-spring-boot-starter-redis/src/main/java/com/orion/visor/framework/redis/core/lock/RedisLocker.java @@ -1,6 +1,7 @@ package com.orion.visor.framework.redis.core.lock; import com.orion.lang.utils.Exceptions; +import com.orion.visor.framework.common.lock.Locker; import lombok.extern.slf4j.Slf4j; import org.redisson.api.RLock; import org.redisson.api.RedissonClient; @@ -15,7 +16,7 @@ import java.util.function.Supplier; * @since 2024/4/25 16:42 */ @Slf4j -public class RedisLocker { +public class RedisLocker implements Locker { private final RedissonClient redissonClient; @@ -23,19 +24,13 @@ public class RedisLocker { this.redissonClient = redissonClient; } - /** - * 尝试获取锁 - * - * @param key key - * @param run run - * @return 是否获取到锁 - */ + @Override public boolean tryLock(String key, Runnable run) { // 获取锁 RLock lock = redissonClient.getLock(key); // 未获取到直接返回 if (!lock.tryLock()) { - log.info("RedisLocks.tryLock failed {}", key); + log.info("RedisLocker.tryLock failed {}", key); return false; } // 执行 @@ -47,20 +42,13 @@ public class RedisLocker { return true; } - /** - * 尝试获取锁 - * - * @param key key - * @param call call - * @param T - * @return 执行结果 - */ + @Override public T tryLock(String key, Supplier call) { // 获取锁 RLock lock = redissonClient.getLock(key); // 未获取到直接返回 if (!lock.tryLock()) { - log.info("RedisLocks.tryLock failed {}", key); + log.info("RedisLocker.tryLock failed {}", key); throw Exceptions.lock(); } // 执行 diff --git a/orion-visor-framework/orion-visor-spring-boot-starter-redis/src/main/resources/META-INF/spring-configuration-metadata.json b/orion-visor-framework/orion-visor-spring-boot-starter-redis/src/main/resources/META-INF/spring-configuration-metadata.json index cc878bd8..b9f2c777 100644 --- a/orion-visor-framework/orion-visor-spring-boot-starter-redis/src/main/resources/META-INF/spring-configuration-metadata.json +++ b/orion-visor-framework/orion-visor-spring-boot-starter-redis/src/main/resources/META-INF/spring-configuration-metadata.json @@ -10,12 +10,14 @@ { "name": "spring.redisson.threads", "type": "java.lang.Integer", - "description": "任务线程数." + "description": "任务线程数.", + "defaultValue": "16" }, { "name": "spring.redisson.netty-threads", "type": "java.lang.Integer", - "description": "netty 线程数." + "description": "netty 线程数.", + "defaultValue": "16" } ] } \ No newline at end of file diff --git a/orion-visor-framework/orion-visor-spring-boot-starter-test/src/main/java/com/orion/visor/framework/test/configuration/OrionH2SqlInitializationTestConfiguration.java b/orion-visor-framework/orion-visor-spring-boot-starter-test/src/main/java/com/orion/visor/framework/test/configuration/OrionH2SqlInitializationTestConfiguration.java index 17f0feaf..ae93dee9 100644 --- a/orion-visor-framework/orion-visor-spring-boot-starter-test/src/main/java/com/orion/visor/framework/test/configuration/OrionH2SqlInitializationTestConfiguration.java +++ b/orion-visor-framework/orion-visor-spring-boot-starter-test/src/main/java/com/orion/visor/framework/test/configuration/OrionH2SqlInitializationTestConfiguration.java @@ -22,8 +22,8 @@ import javax.sql.DataSource; * @version 1.0.0 * @since 2023/8/23 17:17 */ +@Lazy(false) @Profile("unit-test") -@Lazy(value = false) @Configuration(proxyBeanMethods = false) @ConditionalOnMissingBean(AbstractScriptDatabaseInitializer.class) @ConditionalOnSingleCandidate(DataSource.class) diff --git a/orion-visor-framework/orion-visor-spring-boot-starter-test/src/main/java/com/orion/visor/framework/test/configuration/OrionMockRedisTestConfiguration.java b/orion-visor-framework/orion-visor-spring-boot-starter-test/src/main/java/com/orion/visor/framework/test/configuration/OrionMockRedisTestConfiguration.java index 75989070..2e57f92b 100644 --- a/orion-visor-framework/orion-visor-spring-boot-starter-test/src/main/java/com/orion/visor/framework/test/configuration/OrionMockRedisTestConfiguration.java +++ b/orion-visor-framework/orion-visor-spring-boot-starter-test/src/main/java/com/orion/visor/framework/test/configuration/OrionMockRedisTestConfiguration.java @@ -1,6 +1,8 @@ package com.orion.visor.framework.test.configuration; import com.github.fppt.jedismock.RedisServer; +import com.orion.visor.framework.common.lock.Locker; +import com.orion.visor.framework.common.utils.LockerUtils; import org.springframework.boot.autoconfigure.data.redis.RedisProperties; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Bean; @@ -8,6 +10,8 @@ import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Lazy; import org.springframework.context.annotation.Profile; +import java.util.function.Supplier; + /** * 单元测试 redis mock server 初始化 * @@ -34,4 +38,25 @@ public class OrionMockRedisTestConfiguration { return server; } + /** + * @return 单元测试分布式锁 + */ + @Bean + public Locker unitTestLocker() { + Locker locker = new Locker() { + @Override + public boolean tryLock(String key, Runnable run) { + run.run(); + return true; + } + + @Override + public T tryLock(String key, Supplier call) { + return call.get(); + } + }; + LockerUtils.setDelegate(locker); + return locker; + } + } diff --git a/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/com/orion/visor/module/asset/task/CommandSnippetGroupAutoClearTask.java b/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/com/orion/visor/module/asset/task/CommandSnippetGroupAutoClearTask.java index 0993d8a9..e2318149 100644 --- a/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/com/orion/visor/module/asset/task/CommandSnippetGroupAutoClearTask.java +++ b/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/com/orion/visor/module/asset/task/CommandSnippetGroupAutoClearTask.java @@ -1,6 +1,6 @@ package com.orion.visor.module.asset.task; -import com.orion.visor.framework.redis.core.utils.RedisLocks; +import com.orion.visor.framework.common.utils.LockerUtils; import com.orion.visor.module.asset.service.CommandSnippetGroupService; import lombok.extern.slf4j.Slf4j; import org.springframework.scheduling.annotation.Scheduled; @@ -34,7 +34,7 @@ public class CommandSnippetGroupAutoClearTask { public void clear() { log.info("CommandSnippetGroupAutoClearTask.clear start"); // 获取锁并清理 - RedisLocks.tryLock(LOCK_KEY, commandSnippetGroupService::clearUnusedGroup); + LockerUtils.tryLock(LOCK_KEY, commandSnippetGroupService::clearUnusedGroup); log.info("CommandSnippetGroupAutoClearTask.clear finish"); } diff --git a/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/com/orion/visor/module/asset/task/ExecLogFileAutoClearTask.java b/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/com/orion/visor/module/asset/task/ExecLogFileAutoClearTask.java index 776be549..633ac34f 100644 --- a/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/com/orion/visor/module/asset/task/ExecLogFileAutoClearTask.java +++ b/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/com/orion/visor/module/asset/task/ExecLogFileAutoClearTask.java @@ -4,7 +4,7 @@ import com.orion.lang.utils.Strings; import com.orion.lang.utils.io.Files1; import com.orion.lang.utils.time.Dates; import com.orion.visor.framework.common.file.FileClient; -import com.orion.visor.framework.redis.core.utils.RedisLocks; +import com.orion.visor.framework.common.utils.LockerUtils; import com.orion.visor.module.asset.dao.ExecHostLogDAO; import com.orion.visor.module.asset.define.config.AppExecLogConfig; import com.orion.visor.module.asset.entity.domain.ExecHostLogDO; @@ -50,7 +50,7 @@ public class ExecLogFileAutoClearTask { public void clear() { log.info("ExecLogFileAutoClearTask.clear start"); // 获取锁并且执行 - RedisLocks.tryLock(LOCK_KEY, this::doClearFile); + LockerUtils.tryLock(LOCK_KEY, this::doClearFile); log.info("ExecLogFileAutoClearTask.clear finish"); } diff --git a/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/com/orion/visor/module/asset/task/PathBookmarkGroupAutoClearTask.java b/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/com/orion/visor/module/asset/task/PathBookmarkGroupAutoClearTask.java index ff32e041..06790a7d 100644 --- a/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/com/orion/visor/module/asset/task/PathBookmarkGroupAutoClearTask.java +++ b/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/com/orion/visor/module/asset/task/PathBookmarkGroupAutoClearTask.java @@ -1,6 +1,6 @@ package com.orion.visor.module.asset.task; -import com.orion.visor.framework.redis.core.utils.RedisLocks; +import com.orion.visor.framework.common.utils.LockerUtils; import com.orion.visor.module.asset.service.PathBookmarkGroupService; import lombok.extern.slf4j.Slf4j; import org.springframework.scheduling.annotation.Scheduled; @@ -34,7 +34,7 @@ public class PathBookmarkGroupAutoClearTask { public void clear() { log.info("PathBookmarkGroupAutoClearTask.clear start"); // 获取锁并清理 - RedisLocks.tryLock(LOCK_KEY, pathBookmarkGroupService::clearUnusedGroup); + LockerUtils.tryLock(LOCK_KEY, pathBookmarkGroupService::clearUnusedGroup); log.info("PathBookmarkGroupAutoClearTask.clear finish"); } diff --git a/orion-visor-module-asset/orion-visor-module-asset-service/src/test/resources/application-unit-test.yaml b/orion-visor-module-asset/orion-visor-module-asset-service/src/test/resources/application-unit-test.yaml index f837a1b0..ef37b7bc 100644 --- a/orion-visor-module-asset/orion-visor-module-asset-service/src/test/resources/application-unit-test.yaml +++ b/orion-visor-module-asset/orion-visor-module-asset-service/src/test/resources/application-unit-test.yaml @@ -21,6 +21,9 @@ spring: host: 127.0.0.1 port: 16379 database: 0 + redisson: + threads: 2 + netty-threads: 2 mybatis-plus: lazy-initialization: true diff --git a/orion-visor-module-infra/orion-visor-module-infra-service/src/main/java/com/orion/visor/module/infra/task/TagAutoClearTask.java b/orion-visor-module-infra/orion-visor-module-infra-service/src/main/java/com/orion/visor/module/infra/task/TagAutoClearTask.java index e69c3fba..e75f03a2 100644 --- a/orion-visor-module-infra/orion-visor-module-infra-service/src/main/java/com/orion/visor/module/infra/task/TagAutoClearTask.java +++ b/orion-visor-module-infra/orion-visor-module-infra-service/src/main/java/com/orion/visor/module/infra/task/TagAutoClearTask.java @@ -1,6 +1,6 @@ package com.orion.visor.module.infra.task; -import com.orion.visor.framework.redis.core.utils.RedisLocks; +import com.orion.visor.framework.common.utils.LockerUtils; import com.orion.visor.module.infra.service.TagService; import lombok.extern.slf4j.Slf4j; import org.springframework.scheduling.annotation.Scheduled; @@ -34,7 +34,7 @@ public class TagAutoClearTask { public void clear() { log.info("TagAutoClearTask.clear start"); // 获取锁并清理 - RedisLocks.tryLock(LOCK_KEY, tagService::clearUnusedTag); + LockerUtils.tryLock(LOCK_KEY, tagService::clearUnusedTag); log.info("TagAutoClearTask.clear finish"); } diff --git a/orion-visor-module-infra/orion-visor-module-infra-service/src/test/resources/application-unit-test.yaml b/orion-visor-module-infra/orion-visor-module-infra-service/src/test/resources/application-unit-test.yaml index f837a1b0..ef37b7bc 100644 --- a/orion-visor-module-infra/orion-visor-module-infra-service/src/test/resources/application-unit-test.yaml +++ b/orion-visor-module-infra/orion-visor-module-infra-service/src/test/resources/application-unit-test.yaml @@ -21,6 +21,9 @@ spring: host: 127.0.0.1 port: 16379 database: 0 + redisson: + threads: 2 + netty-threads: 2 mybatis-plus: lazy-initialization: true diff --git a/orion-visor-ui/src/views/host/terminal/components/layout/layout-header.vue b/orion-visor-ui/src/views/host/terminal/components/layout/layout-header.vue index d9598b4e..ae62d3a2 100644 --- a/orion-visor-ui/src/views/host/terminal/components/layout/layout-header.vue +++ b/orion-visor-ui/src/views/host/terminal/components/layout/layout-header.vue @@ -69,7 +69,7 @@