woody 4 месяцев назад
Родитель
Сommit
6b32df44c2

+ 3 - 4
framework-base/src/main/java/com/chelvc/framework/base/context/Session.java

@@ -2,14 +2,13 @@ package com.chelvc.framework.base.context;
 
 import java.io.Serializable;
 import java.util.Collections;
-import java.util.Map;
 import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
 
 import com.chelvc.framework.common.model.Caps;
 import com.chelvc.framework.common.model.Platform;
 import com.chelvc.framework.common.model.Terminal;
 import com.chelvc.framework.common.util.ObjectUtils;
-import com.google.common.collect.Maps;
 import lombok.AccessLevel;
 import lombok.AllArgsConstructor;
 import lombok.Builder;
@@ -101,7 +100,7 @@ public class Session implements Serializable {
      */
     @Getter(AccessLevel.NONE)
     @Setter(AccessLevel.NONE)
-    private Map<String, Caps> groups;
+    private ConcurrentHashMap<String, Caps> groups;
 
     /**
      * 获取场景分组
@@ -123,7 +122,7 @@ public class Session implements Serializable {
         if (this.groups == null) {
             synchronized (this) {
                 if (this.groups == null) {
-                    this.groups = Maps.newConcurrentMap();
+                    this.groups = new ConcurrentHashMap<>();
                 }
             }
         }

+ 3 - 15
framework-base/src/main/java/com/chelvc/framework/base/context/SessionContextHolder.java

@@ -580,27 +580,15 @@ public class SessionContextHolder implements ServletRequestListener {
      * @return 分组标识
      */
     public static Caps getGroup(@NonNull String scene) {
-        return getGroup(scene, false);
-    }
-
-    /**
-     * 获取场景分组
-     *
-     * @param scene   分组场景
-     * @param refresh 是否刷新
-     * @return 分组标识
-     */
-    public static Caps getGroup(@NonNull String scene, boolean refresh) {
         Session session = getSession(false);
         if (session == null) {
             return null;
         }
         Caps group = session.getGroup(scene);
-        if (group == null && refresh) {
+        if (group == null) {
             GroupStore store = ApplicationContextHolder.getBean(GroupStore.class);
-            if ((group = store.get(scene)) != null) {
-                session.setGroup(scene, group);
-            }
+            group = ObjectUtils.ifNull(store.get(scene), Caps.NONE);
+            session.setGroup(scene, group);
         }
         return group == Caps.NONE ? null : group;
     }

+ 12 - 0
framework-upload/pom.xml

@@ -15,6 +15,8 @@
     <version>1.0.0-RELEASE</version>
 
     <properties>
+        <aliyun-oss.version>3.17.4</aliyun-oss.version>
+        <aliyun-cdn.version>3.8.8</aliyun-cdn.version>
         <tencent-cos.version>5.6.8</tencent-cos.version>
         <tencent-cdn.version>3.1.1069</tencent-cdn.version>
         <framework-base.version>1.0.0-RELEASE</framework-base.version>
@@ -26,6 +28,16 @@
             <artifactId>framework-base</artifactId>
             <version>${framework-base.version}</version>
         </dependency>
+        <dependency>
+            <groupId>com.aliyun.oss</groupId>
+            <artifactId>aliyun-sdk-oss</artifactId>
+            <version>${aliyun-oss.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>com.aliyun</groupId>
+            <artifactId>aliyun-java-sdk-cdn</artifactId>
+            <version>${aliyun-cdn.version}</version>
+        </dependency>
         <dependency>
             <groupId>com.qcloud</groupId>
             <artifactId>cos_api</artifactId>

+ 3 - 0
framework-upload/src/main/java/com/chelvc/framework/upload/config/UploadConfigurer.java

@@ -1,6 +1,7 @@
 package com.chelvc.framework.upload.config;
 
 import com.chelvc.framework.upload.UploadHandler;
+import com.chelvc.framework.upload.support.AliyunUploadHandler;
 import com.chelvc.framework.upload.support.DefaultUploadHandler;
 import com.chelvc.framework.upload.support.TencentUploadHandler;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
@@ -21,6 +22,8 @@ public class UploadConfigurer {
         UploadProperties.Channel channel = properties.getChannel();
         if (channel == UploadProperties.Channel.DEFAULT) {
             return new DefaultUploadHandler(properties);
+        } else if (channel == UploadProperties.Channel.ALIYUN) {
+            return new AliyunUploadHandler(properties);
         } else if (channel == UploadProperties.Channel.TENCENT) {
             return new TencentUploadHandler(properties);
         }

+ 10 - 0
framework-upload/src/main/java/com/chelvc/framework/upload/config/UploadProperties.java

@@ -24,6 +24,11 @@ public class UploadProperties {
          */
         DEFAULT,
 
+        /**
+         * 阿里云
+         */
+        ALIYUN,
+
         /**
          * 腾讯云
          */
@@ -50,6 +55,11 @@ public class UploadProperties {
      */
     private String domain;
 
+    /**
+     * 服务端点
+     */
+    private String endpoint;
+
     /**
      * 存储目录
      */

+ 108 - 0
framework-upload/src/main/java/com/chelvc/framework/upload/support/AliyunUploadHandler.java

@@ -0,0 +1,108 @@
+package com.chelvc.framework.upload.support;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Arrays;
+
+import com.aliyun.oss.ClientBuilderConfiguration;
+import com.aliyun.oss.OSS;
+import com.aliyun.oss.OSSClientBuilder;
+import com.aliyun.oss.common.auth.DefaultCredentialProvider;
+import com.aliyun.oss.common.comm.Protocol;
+import com.aliyun.oss.common.comm.SignVersion;
+import com.aliyun.oss.model.CannedAccessControlList;
+import com.aliyun.oss.model.ObjectMetadata;
+import com.aliyuncs.DefaultAcsClient;
+import com.aliyuncs.IAcsClient;
+import com.aliyuncs.cdn.model.v20180510.RefreshObjectCachesRequest;
+import com.aliyuncs.exceptions.ClientException;
+import com.aliyuncs.profile.DefaultProfile;
+import com.chelvc.framework.base.util.HttpUtils;
+import com.chelvc.framework.common.util.AssertUtils;
+import com.chelvc.framework.common.util.ObjectUtils;
+import com.chelvc.framework.upload.UploadHandler;
+import com.chelvc.framework.upload.config.UploadProperties;
+import lombok.NonNull;
+
+/**
+ * 基于阿里云OSS文件上传实现
+ *
+ * @author Woody
+ * @date 2024/4/3
+ */
+public class AliyunUploadHandler implements UploadHandler {
+    private final OSS oss;
+    private final IAcsClient acs;
+    private final String domain;
+    private final String directory;
+
+    public AliyunUploadHandler(@NonNull UploadProperties properties) {
+        String appid = AssertUtils.nonempty(properties.getAppid(), () -> "Aliyun upload appid is missing");
+        String secret = AssertUtils.nonempty(properties.getSecret(), () -> "Aliyun upload secret is missing");
+        String region = AssertUtils.nonempty(properties.getRegion(), () -> "Aliyun upload region is missing");
+        String endpoint = AssertUtils.nonempty(properties.getEndpoint(), () -> "Aliyun upload endpoint is missing");
+        this.domain = AssertUtils.nonempty(properties.getDomain(), () -> "Aliyun upload domain is missing");
+        this.directory = AssertUtils.nonempty(properties.getDirectory(), () -> "Aliyun upload directory is missing");
+
+        // 初始化OSS客户端
+        ClientBuilderConfiguration configuration = new ClientBuilderConfiguration();
+        configuration.setSignatureVersion(SignVersion.V4);
+        configuration.setProtocol(Protocol.HTTPS);
+        configuration.setMaxConnections(properties.getHttpclient().getMaxTotal());
+        configuration.setConnectionTimeout(properties.getHttpclient().getConnectTimeout());
+        configuration.setSocketTimeout(properties.getHttpclient().getSocketTimeout());
+        configuration.setConnectionRequestTimeout(properties.getHttpclient().getConnectionRequestTimeout());
+        this.oss = OSSClientBuilder.create().region(region).endpoint(endpoint).clientConfiguration(configuration)
+                .credentialsProvider(new DefaultCredentialProvider(appid, secret)).build();
+
+        //初始化ACS客户端
+        this.acs = new DefaultAcsClient(DefaultProfile.getProfile(region, appid, secret));
+    }
+
+    @Override
+    public void refreshContentDeliveryNetwork(@NonNull String... urls) {
+        if (ObjectUtils.isEmpty(urls)) {
+            return;
+        }
+
+        //单次提交多个 URL 或多个目录时,使用换行符(\n)或(\r\n)分隔。单次提交的任务中所有 URL 的域名个数总和需要在 10 个以内
+        ObjectUtils.split(Arrays.asList(urls), 10, (n, sublist) -> {
+            RefreshObjectCachesRequest request = new RefreshObjectCachesRequest();
+            request.setObjectPath(String.join("\\n", sublist));
+            request.setObjectType("File");
+            try {
+                this.acs.getAcsResponse(request);
+            } catch (ClientException e) {
+                throw new RuntimeException(e);
+            }
+        });
+    }
+
+    @Override
+    public String upload(@NonNull File file, @NonNull String filename) throws IOException {
+        ObjectMetadata metadata = new ObjectMetadata();
+        metadata.setObjectAcl(CannedAccessControlList.PublicRead);
+        this.oss.putObject(this.directory, filename, file, metadata);
+        return HttpUtils.url(this.domain, filename);
+    }
+
+    @Override
+    public String upload(@NonNull InputStream stream, @NonNull String filename) throws IOException {
+        return this.upload(stream, filename, stream.available());
+    }
+
+    @Override
+    public String upload(@NonNull InputStream stream, @NonNull String filename, long length) throws IOException {
+        ObjectMetadata metadata = new ObjectMetadata();
+        metadata.setContentLength(length);
+        metadata.setObjectAcl(CannedAccessControlList.PublicRead);
+        this.oss.putObject(this.directory, filename, stream, metadata);
+        return HttpUtils.url(this.domain, filename);
+    }
+
+    @Override
+    public void destroy() {
+        this.oss.shutdown();
+    }
+}