refactor(common-oss): 优化 OSS 客户端生命周期与配置构建

- 下载 InputStream 回调后自动关闭响应流,避免底层连接释放不明确
  - 统一解包异步调用异常,保留真实 S3 错误原因
  - OssFactory 改为按 configKey 粒度加锁,降低多配置初始化阻塞
  - OSS 配置更新和删除后主动移除本地旧客户端,释放相关资源
  - 收敛 OSS region、ACL、路径风格和访问 URL 构建逻辑
  - Options 新增 create 方法,保留 builder 兼容旧调用
This commit is contained in:
疯狂的狮子Li
2026-05-16 14:56:07 +08:00
parent ce764f08a7
commit 287cce6238
5 changed files with 123 additions and 94 deletions
@@ -17,6 +17,7 @@ import org.dromara.common.json.utils.JsonUtils;
import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.common.mybatis.core.query.QueryBuilder;
import org.dromara.common.oss.constant.OssConstant;
import org.dromara.common.oss.factory.OssFactory;
import org.dromara.common.redis.utils.CacheUtils;
import org.dromara.common.redis.utils.RedisUtils;
import org.dromara.system.domain.SysOssConfig;
@@ -29,6 +30,7 @@ import org.springframework.transaction.annotation.Transactional;
import java.util.Collection;
import java.util.List;
import java.util.Objects;
/**
* 对象存储配置Service业务层处理
@@ -130,6 +132,7 @@ public class SysOssConfigServiceImpl implements ISysOssConfigService {
public Boolean updateByBo(SysOssConfigBo bo) {
SysOssConfig config = MapstructUtils.convert(bo, SysOssConfig.class);
validEntityBeforeSave(config);
SysOssConfig oldConfig = ossConfigMapper.selectById(config.getOssConfigId());
boolean flag = ossConfigMapper.lambda()
.set(ObjectUtil.isNull(config.getPrefix()), SysOssConfig::getPrefix, "")
.set(ObjectUtil.isNull(config.getRegion()), SysOssConfig::getRegion, "")
@@ -140,7 +143,12 @@ public class SysOssConfigServiceImpl implements ISysOssConfigService {
if (flag) {
// 从数据库查询完整的数据做缓存
config = ossConfigMapper.selectById(config.getOssConfigId());
if (ObjectUtil.isNotNull(oldConfig) && !Objects.equals(oldConfig.getConfigKey(), config.getConfigKey())) {
CacheUtils.evict(CacheNames.SYS_OSS_CONFIG, oldConfig.getConfigKey());
OssFactory.remove(oldConfig.getConfigKey());
}
CacheUtils.put(CacheNames.SYS_OSS_CONFIG, config.getConfigKey(), JsonUtils.toJsonString(config));
OssFactory.remove(config.getConfigKey());
}
return flag;
}
@@ -174,12 +182,16 @@ public class SysOssConfigServiceImpl implements ISysOssConfigService {
List<SysOssConfig> list = CollUtil.newArrayList();
for (Long configId : ids) {
SysOssConfig config = ossConfigMapper.selectById(configId);
list.add(config);
if (ObjectUtil.isNotNull(config)) {
list.add(config);
}
}
boolean flag = ossConfigMapper.deleteByIds(ids) > 0;
if (flag) {
list.forEach(sysOssConfig ->
CacheUtils.evict(CacheNames.SYS_OSS_CONFIG, sysOssConfig.getConfigKey()));
list.forEach(sysOssConfig -> {
CacheUtils.evict(CacheNames.SYS_OSS_CONFIG, sysOssConfig.getConfigKey());
OssFactory.remove(sysOssConfig.getConfigKey());
});
}
return flag;
}