From 25b47db3cb5f99c1b266138444587c3bb026dd60 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=96=AF=E7=8B=82=E7=9A=84=E7=8B=AE=E5=AD=90li?= <15040126243@163.com> Date: Sun, 15 Aug 2021 16:59:46 +0800 Subject: [PATCH] =?UTF-8?q?update=20=E7=A7=BB=E9=99=A4Spring=E6=B3=A8?= =?UTF-8?q?=E5=85=A5=20=E6=94=B9=E4=B8=BA=E5=85=A8=E5=B1=80=E7=BC=93?= =?UTF-8?q?=E5=AD=98=20=E5=B9=B6=E4=BD=BF=E7=94=A8=E6=9B=B4=E6=96=B0?= =?UTF-8?q?=E6=97=B6=E9=97=B4=E7=A1=AE=E4=BF=9D=E9=9B=86=E7=BE=A4=E9=85=8D?= =?UTF-8?q?=E7=BD=AE=E6=9C=80=E7=BB=88=E4=B8=80=E8=87=B4=E6=80=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/ruoyi/oss/factory/OssFactory.java | 49 ++++++++++++------- .../properties/CloudStorageProperties.java | 7 +++ .../oss/service/ICloudStorageStrategy.java | 2 +- .../service/impl/SysOssConfigServiceImpl.java | 36 +++++++------- 4 files changed, 57 insertions(+), 37 deletions(-) diff --git a/ruoyi-oss/src/main/java/com/ruoyi/oss/factory/OssFactory.java b/ruoyi-oss/src/main/java/com/ruoyi/oss/factory/OssFactory.java index ea64b27ac..129068561 100644 --- a/ruoyi-oss/src/main/java/com/ruoyi/oss/factory/OssFactory.java +++ b/ruoyi-oss/src/main/java/com/ruoyi/oss/factory/OssFactory.java @@ -12,6 +12,7 @@ import com.ruoyi.oss.exception.OssException; import com.ruoyi.oss.properties.CloudStorageProperties; import com.ruoyi.oss.service.ICloudStorageStrategy; +import java.util.Date; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; @@ -22,15 +23,27 @@ import java.util.concurrent.ConcurrentHashMap; */ public class OssFactory { - private static RedisCache redisCache; + private static RedisCache redisCache; static { OssFactory.redisCache = SpringUtils.getBean(RedisCache.class); } + /** + * 服务实例缓存 + */ private static final Map SERVICES = new ConcurrentHashMap<>(); + /** + * 服务配置更新时间缓存 + */ + private static final Map SERVICES_UPDATE_TIME = new ConcurrentHashMap<>(); + + /** + * 获取默认实例 + */ public static ICloudStorageStrategy instance() { + // 获取redis 默认类型 String type = Convert.toStr(redisCache.getCacheObject(CloudConstant.CACHE_CONFIG_KEY)); if (StringUtils.isEmpty(type)) { throw new OssException("文件存储服务类型无法找到!"); @@ -38,27 +51,27 @@ public class OssFactory { return instance(type); } + /** + * 根据类型获取实例 + */ public static ICloudStorageStrategy instance(String type) { ICloudStorageStrategy service = SERVICES.get(type); - if (service == null) { - Object json = redisCache.getCacheObject(CloudConstant.SYS_OSS_KEY + type); - CloudStorageProperties properties = JsonUtils.parseObject(json.toString(), CloudStorageProperties.class); - String beanName = CloudServiceEnumd.getServiceName(type); - ICloudStorageStrategy bean = (ICloudStorageStrategy) ReflectUtils.newInstance(CloudServiceEnumd.getServiceClass(type), properties); - SpringUtils.registerBean(beanName, bean); - service = SpringUtils.getBean(beanName); - SERVICES.put(type, bean); + Date oldDate = SERVICES_UPDATE_TIME.get(type); + Object json = redisCache.getCacheObject(CloudConstant.SYS_OSS_KEY + type); + CloudStorageProperties properties = JsonUtils.parseObject(json.toString(), CloudStorageProperties.class); + if (properties == null) { + throw new OssException("系统异常, '" + type + "'配置信息不存在!"); } + Date nowDate = properties.getUpdateTime(); + // 服务存在并更新时间相同则返回(使用更新时间确保配置最终一致性) + if (service != null && oldDate.equals(nowDate)) { + return service; + } + // 获取redis配置信息 创建对象 并缓存 + service = (ICloudStorageStrategy) ReflectUtils.newInstance(CloudServiceEnumd.getServiceClass(type), properties); + SERVICES.put(type, service); + SERVICES_UPDATE_TIME.put(type, nowDate); return service; } - public static void destroy(String type) { - ICloudStorageStrategy service = SERVICES.get(type); - if (service == null) { - return; - } - SpringUtils.unregisterBean(CloudServiceEnumd.getServiceName(type)); - SERVICES.remove(type); - } - } diff --git a/ruoyi-oss/src/main/java/com/ruoyi/oss/properties/CloudStorageProperties.java b/ruoyi-oss/src/main/java/com/ruoyi/oss/properties/CloudStorageProperties.java index d1bafdecf..1c62ae2ca 100644 --- a/ruoyi-oss/src/main/java/com/ruoyi/oss/properties/CloudStorageProperties.java +++ b/ruoyi-oss/src/main/java/com/ruoyi/oss/properties/CloudStorageProperties.java @@ -2,6 +2,8 @@ package com.ruoyi.oss.properties; import lombok.Data; +import java.util.Date; + /** * OSS云存储 配置属性 * @@ -45,4 +47,9 @@ public class CloudStorageProperties { */ private String isHttps; + /** + * 更新时间 + */ + private Date updateTime; + } diff --git a/ruoyi-oss/src/main/java/com/ruoyi/oss/service/ICloudStorageStrategy.java b/ruoyi-oss/src/main/java/com/ruoyi/oss/service/ICloudStorageStrategy.java index 6f8ed85ca..f91fc7af6 100644 --- a/ruoyi-oss/src/main/java/com/ruoyi/oss/service/ICloudStorageStrategy.java +++ b/ruoyi-oss/src/main/java/com/ruoyi/oss/service/ICloudStorageStrategy.java @@ -70,5 +70,5 @@ public interface ICloudStorageStrategy { */ UploadResult uploadSuffix(InputStream inputStream, String suffix, String contentType); - String getEndpointLink(); + String getEndpointLink(); } diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysOssConfigServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysOssConfigServiceImpl.java index 49bf1fabc..a202790b1 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysOssConfigServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysOssConfigServiceImpl.java @@ -15,7 +15,6 @@ import com.ruoyi.common.utils.JsonUtils; import com.ruoyi.common.utils.PageUtils; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.oss.constant.CloudConstant; -import com.ruoyi.oss.factory.OssFactory; import com.ruoyi.system.domain.SysOssConfig; import com.ruoyi.system.domain.bo.SysOssConfigBo; import com.ruoyi.system.domain.vo.SysOssConfigVo; @@ -54,7 +53,7 @@ public class SysOssConfigServiceImpl extends ServicePlusImpl