AutoClosable

This commit is contained in:
Jerry Yan 2025-03-26 14:31:11 +08:00
parent a08f4adf2d
commit 48a3dfb313
2 changed files with 126 additions and 78 deletions

View File

@ -27,9 +27,7 @@ import org.apache.commons.lang3.StringUtils;
import java.io.InputStream; import java.io.InputStream;
import java.net.URL; import java.net.URL;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections;
import java.util.Date; import java.util.Date;
import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@ -69,8 +67,8 @@ final public class AliOssAdapter extends AStorageAdapter {
return null; return null;
} }
String fullPath = buildPath(path); String fullPath = buildPath(path);
OSS ossClient = getOssClient(); try (OSSWrapper wrapper = getOssClient()) {
try { OSS ossClient = wrapper.getOSSClient();
ObjectMetadata metadata = new ObjectMetadata(); ObjectMetadata metadata = new ObjectMetadata();
metadata.setContentLength(inputStream.available()); metadata.setContentLength(inputStream.available());
PutObjectRequest putObjectRequest = new PutObjectRequest(config.getBucketName(), fullPath, inputStream); PutObjectRequest putObjectRequest = new PutObjectRequest(config.getBucketName(), fullPath, inputStream);
@ -84,8 +82,8 @@ final public class AliOssAdapter extends AStorageAdapter {
@Override @Override
public boolean deleteFile(String... path) { public boolean deleteFile(String... path) {
OSS ossClient = getOssClient(); try (OSSWrapper wrapper = getOssClient()) {
try { OSS ossClient = wrapper.getOSSClient();
ossClient.deleteObject(config.getBucketName(), buildPath(path)); ossClient.deleteObject(config.getBucketName(), buildPath(path));
return true; return true;
} catch (ClientException e) { } catch (ClientException e) {
@ -100,14 +98,17 @@ final public class AliOssAdapter extends AStorageAdapter {
@Override @Override
public String getUrlForDownload(Date expireDate, String... path) { public String getUrlForDownload(Date expireDate, String... path) {
OSS ossClient = getOssClient(); try (OSSWrapper wrapper = getOssClient()) {
OSS ossClient = wrapper.getOSSClient();
URL url = ossClient.generatePresignedUrl(config.getBucketName(), buildPath(path), expireDate, HttpMethod.GET); URL url = ossClient.generatePresignedUrl(config.getBucketName(), buildPath(path), expireDate, HttpMethod.GET);
return url.toString(); return url.toString();
} }
}
@Override @Override
public String getUrlForUpload(Date expireDate, String contentType, String... path) { public String getUrlForUpload(Date expireDate, String contentType, String... path) {
OSS ossClient = getOssClient(); try (OSSWrapper wrapper = getOssClient()) {
OSS ossClient = wrapper.getOSSClient();
GeneratePresignedUrlRequest request = new GeneratePresignedUrlRequest(config.getBucketName(), buildPath(path), HttpMethod.PUT); GeneratePresignedUrlRequest request = new GeneratePresignedUrlRequest(config.getBucketName(), buildPath(path), HttpMethod.PUT);
if (StringUtils.isNotBlank(contentType)) { if (StringUtils.isNotBlank(contentType)) {
request.setContentType(contentType); request.setContentType(contentType);
@ -116,17 +117,18 @@ final public class AliOssAdapter extends AStorageAdapter {
URL url = ossClient.generatePresignedUrl(request); URL url = ossClient.generatePresignedUrl(request);
return url.toString(); return url.toString();
} }
}
@Override @Override
public List<StorageFileObject> listDir(String... path) { public List<StorageFileObject> listDir(String... path) {
OSS ossClient = getOssClient();
ListObjectsV2Request listObjectsV2Request = new ListObjectsV2Request(config.getBucketName()); ListObjectsV2Request listObjectsV2Request = new ListObjectsV2Request(config.getBucketName());
listObjectsV2Request.setPrefix(buildPath(path) + "/"); listObjectsV2Request.setPrefix(buildPath(path) + "/");
listObjectsV2Request.setMaxKeys(1000); listObjectsV2Request.setMaxKeys(1000);
boolean isTruncated = true; boolean isTruncated = true;
String continuationToken = null; String continuationToken = null;
List<OSSObjectSummary> objectList = new ArrayList<>(); List<OSSObjectSummary> objectList = new ArrayList<>();
try { try (OSSWrapper wrapper = getOssClient()) {
OSS ossClient = wrapper.getOSSClient();
while (isTruncated) { while (isTruncated) {
if (continuationToken != null) { if (continuationToken != null) {
listObjectsV2Request.setContinuationToken(continuationToken); listObjectsV2Request.setContinuationToken(continuationToken);
@ -156,10 +158,11 @@ final public class AliOssAdapter extends AStorageAdapter {
@Override @Override
public boolean deleteDir(String... path) { public boolean deleteDir(String... path) {
List<StorageFileObject> objectList = listDir(buildPath(path)); List<StorageFileObject> objectList = listDir(buildPath(path));
OSS ossClient = getOssClient();
if (objectList.isEmpty()) { if (objectList.isEmpty()) {
return true; return true;
} }
try (OSSWrapper wrapper = getOssClient()) {
OSS ossClient = wrapper.getOSSClient();
int idx = 0; int idx = 0;
int batchSize = 999; int batchSize = 999;
while (objectList.size() > idx) { while (objectList.size() > idx) {
@ -177,6 +180,9 @@ final public class AliOssAdapter extends AStorageAdapter {
} }
} }
return true; return true;
} catch (OSSException e) {
return false;
}
} }
private CannedAccessControlList convertAcl(StorageAcl acl) { private CannedAccessControlList convertAcl(StorageAcl acl) {
@ -196,8 +202,8 @@ final public class AliOssAdapter extends AStorageAdapter {
@Override @Override
public boolean setAcl(StorageAcl acl, String... path) { public boolean setAcl(StorageAcl acl, String... path) {
OSS ossClient = getOssClient(); try (OSSWrapper wrapper = getOssClient()) {
try { OSS ossClient = wrapper.getOSSClient();
ossClient.setObjectAcl(config.getBucketName(), buildPath(path), convertAcl(acl)); ossClient.setObjectAcl(config.getBucketName(), buildPath(path), convertAcl(acl));
return true; return true;
} catch (OSSException e) { } catch (OSSException e) {
@ -205,9 +211,9 @@ final public class AliOssAdapter extends AStorageAdapter {
} }
} }
private OSS getOssClient() { private OSSWrapper getOssClient() {
OSS ossClient = new OSSClientBuilder().build(config.getEndpoint(), config.getAccessKeyId(), config.getAccessKeySecret()); OSS ossClient = new OSSClientBuilder().build(config.getEndpoint(), config.getAccessKeyId(), config.getAccessKeySecret());
return ossClient; return new OSSWrapper(ossClient);
} }
private String buildPath(String ...paths) { private String buildPath(String ...paths) {
@ -221,4 +227,23 @@ final public class AliOssAdapter extends AStorageAdapter {
private String getRelativePath(String path) { private String getRelativePath(String path) {
return StorageUtil.getRelativePath(path, config.getPrefix()); return StorageUtil.getRelativePath(path, config.getPrefix());
} }
public static class OSSWrapper implements AutoCloseable {
private final OSS ossClient;
public OSSWrapper(OSS ossClient) {
this.ossClient = ossClient;
}
// 提供对原始对象的方法访问
public OSS getOSSClient() {
return ossClient;
}
@Override
public void close() {
// 在此处实现资源关闭逻辑如调用 OSS 的关闭方法
ossClient.shutdown(); // 假设 OSS 提供 shutdown 方法关闭资源
}
}
} }

View File

@ -4,9 +4,7 @@ import com.amazonaws.ClientConfiguration;
import com.amazonaws.HttpMethod; import com.amazonaws.HttpMethod;
import com.amazonaws.Protocol; import com.amazonaws.Protocol;
import com.amazonaws.auth.BasicAWSCredentials; import com.amazonaws.auth.BasicAWSCredentials;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3Client; import com.amazonaws.services.s3.AmazonS3Client;
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
import com.amazonaws.services.s3.S3ClientOptions; import com.amazonaws.services.s3.S3ClientOptions;
import com.amazonaws.services.s3.model.*; import com.amazonaws.services.s3.model.*;
import com.ycwl.basic.storage.entity.AwsOssStorageConfig; import com.ycwl.basic.storage.entity.AwsOssStorageConfig;
@ -22,7 +20,6 @@ import org.apache.commons.lang3.StringUtils;
import java.io.InputStream; import java.io.InputStream;
import java.net.URL; import java.net.URL;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections;
import java.util.Date; import java.util.Date;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
@ -63,8 +60,8 @@ public class AwsOssAdapter extends AStorageAdapter {
return null; return null;
} }
String fullPath = buildPath(path); String fullPath = buildPath(path);
AmazonS3 s3Client = getS3Client(); try (S3Wrapper wrapper = getS3Client()) {
try { AmazonS3Client s3Client = wrapper.getS3Client();
ObjectMetadata metadata = new ObjectMetadata(); ObjectMetadata metadata = new ObjectMetadata();
metadata.setContentLength(inputStream.available()); metadata.setContentLength(inputStream.available());
PutObjectRequest putObjectRequest = new PutObjectRequest(config.getBucketName(), fullPath, inputStream, metadata); PutObjectRequest putObjectRequest = new PutObjectRequest(config.getBucketName(), fullPath, inputStream, metadata);
@ -78,8 +75,8 @@ public class AwsOssAdapter extends AStorageAdapter {
@Override @Override
public boolean deleteFile(String... path) { public boolean deleteFile(String... path) {
AmazonS3 s3Client = getS3Client(); try (S3Wrapper wrapper = getS3Client()) {
try { AmazonS3Client s3Client = wrapper.getS3Client();
s3Client.deleteObject(config.getBucketName(), buildPath(path)); s3Client.deleteObject(config.getBucketName(), buildPath(path));
return true; return true;
} catch (Exception e) { } catch (Exception e) {
@ -94,14 +91,17 @@ public class AwsOssAdapter extends AStorageAdapter {
@Override @Override
public String getUrlForDownload(Date expireDate, String... path) { public String getUrlForDownload(Date expireDate, String... path) {
AmazonS3 s3Client = getS3Client(); try (S3Wrapper wrapper = getS3Client()) {
AmazonS3Client s3Client = wrapper.getS3Client();
URL url = s3Client.generatePresignedUrl(config.getBucketName(), buildPath(path), expireDate); URL url = s3Client.generatePresignedUrl(config.getBucketName(), buildPath(path), expireDate);
return url.toString(); return url.toString();
} }
}
@Override @Override
public String getUrlForUpload(Date expireDate, String contentType, String... path) { public String getUrlForUpload(Date expireDate, String contentType, String... path) {
AmazonS3 s3Client = getS3Client(); try (S3Wrapper wrapper = getS3Client()) {
AmazonS3Client s3Client = wrapper.getS3Client();
GeneratePresignedUrlRequest request = new GeneratePresignedUrlRequest(config.getBucketName(), buildPath(path)); GeneratePresignedUrlRequest request = new GeneratePresignedUrlRequest(config.getBucketName(), buildPath(path));
request.setMethod(HttpMethod.PUT); request.setMethod(HttpMethod.PUT);
if (StringUtils.isNotBlank(contentType)) { if (StringUtils.isNotBlank(contentType)) {
@ -111,10 +111,10 @@ public class AwsOssAdapter extends AStorageAdapter {
URL url = s3Client.generatePresignedUrl(request); URL url = s3Client.generatePresignedUrl(request);
return url.toString(); return url.toString();
} }
}
@Override @Override
public List<StorageFileObject> listDir(String... path) { public List<StorageFileObject> listDir(String... path) {
AmazonS3 s3Client = getS3Client();
ListObjectsV2Request listObjectsV2Request = new ListObjectsV2Request() ListObjectsV2Request listObjectsV2Request = new ListObjectsV2Request()
.withBucketName(config.getBucketName()) .withBucketName(config.getBucketName())
.withPrefix(buildPath(path) + "/") .withPrefix(buildPath(path) + "/")
@ -122,7 +122,8 @@ public class AwsOssAdapter extends AStorageAdapter {
boolean isTruncated = true; boolean isTruncated = true;
String continuationToken = null; String continuationToken = null;
List<S3ObjectSummary> objectList = new ArrayList<>(); List<S3ObjectSummary> objectList = new ArrayList<>();
try { try (S3Wrapper wrapper = getS3Client()) {
AmazonS3Client s3Client = wrapper.getS3Client();
while (isTruncated) { while (isTruncated) {
if (continuationToken != null) { if (continuationToken != null) {
listObjectsV2Request.setContinuationToken(continuationToken); listObjectsV2Request.setContinuationToken(continuationToken);
@ -152,10 +153,11 @@ public class AwsOssAdapter extends AStorageAdapter {
@Override @Override
public boolean deleteDir(String... path) { public boolean deleteDir(String... path) {
List<StorageFileObject> objectList = listDir(buildPath(path)); List<StorageFileObject> objectList = listDir(buildPath(path));
AmazonS3 s3Client = getS3Client();
if (objectList.isEmpty()) { if (objectList.isEmpty()) {
return true; return true;
} }
try (S3Wrapper wrapper = getS3Client()) {
AmazonS3Client s3Client = wrapper.getS3Client();
int idx = 0; int idx = 0;
int batchSize = 999; int batchSize = 999;
while (objectList.size() > idx) { while (objectList.size() > idx) {
@ -173,6 +175,9 @@ public class AwsOssAdapter extends AStorageAdapter {
} }
} }
return true; return true;
} catch (Exception e) {
return false;
}
} }
private CannedAccessControlList convertAcl(StorageAcl acl) { private CannedAccessControlList convertAcl(StorageAcl acl) {
@ -192,8 +197,8 @@ public class AwsOssAdapter extends AStorageAdapter {
@Override @Override
public boolean setAcl(StorageAcl acl, String... path) { public boolean setAcl(StorageAcl acl, String... path) {
AmazonS3 s3Client = getS3Client(); try (S3Wrapper wrapper = getS3Client()) {
try { AmazonS3Client s3Client = wrapper.getS3Client();
s3Client.setObjectAcl(config.getBucketName(), buildPath(path), convertAcl(acl)); s3Client.setObjectAcl(config.getBucketName(), buildPath(path), convertAcl(acl));
return true; return true;
} catch (Exception e) { } catch (Exception e) {
@ -201,7 +206,7 @@ public class AwsOssAdapter extends AStorageAdapter {
} }
} }
private AmazonS3Client getS3Client() { private S3Wrapper getS3Client() {
BasicAWSCredentials basicAwsCred = new BasicAWSCredentials(config.getAccessKeyId(), config.getAccessKeySecret()); BasicAWSCredentials basicAwsCred = new BasicAWSCredentials(config.getAccessKeyId(), config.getAccessKeySecret());
ClientConfiguration clientConfiguration = new ClientConfiguration(); ClientConfiguration clientConfiguration = new ClientConfiguration();
clientConfiguration.setProtocol(Protocol.HTTPS); clientConfiguration.setProtocol(Protocol.HTTPS);
@ -209,7 +214,7 @@ public class AwsOssAdapter extends AStorageAdapter {
S3ClientOptions options = S3ClientOptions.builder().setPathStyleAccess(true).setPayloadSigningEnabled(true).disableChunkedEncoding().build(); S3ClientOptions options = S3ClientOptions.builder().setPathStyleAccess(true).setPayloadSigningEnabled(true).disableChunkedEncoding().build();
s3.setS3ClientOptions(options); s3.setS3ClientOptions(options);
s3.setEndpoint(config.getEndpoint()); s3.setEndpoint(config.getEndpoint());
return s3; return new S3Wrapper(s3);
} }
private String buildPath(String... paths) { private String buildPath(String... paths) {
@ -223,4 +228,22 @@ public class AwsOssAdapter extends AStorageAdapter {
private String getRelativePath(String path) { private String getRelativePath(String path) {
return StorageUtil.getRelativePath(path, config.getPrefix()); return StorageUtil.getRelativePath(path, config.getPrefix());
} }
public static class S3Wrapper implements AutoCloseable {
private final AmazonS3Client s3Client;
public S3Wrapper(AmazonS3Client s3Client) {
this.s3Client = s3Client;
}
// 提供对原始对象的方法访问
public AmazonS3Client getS3Client() {
return s3Client;
}
@Override
public void close() {
s3Client.shutdown();
}
}
} }