项目中多处使用阿里云 OSS 服务,但测试环境最近频频出现异常 [Client]Unable to execute HTTP request: SocketException。起初还以为会不会是上传方式有问题,从普通上传改为了分片上传,本想通过官方文档和浏览器检索看看有没有相关问题,但都没有什么结论。
后来在阿里云控制台提交工单,描述了一下异常情况后也没有得到很好的解决,但获得了有用的线索——OSS 日志,紧接着去开通了日志管理服务。
但这个搜索字段也是蛮多,由于异常的原因获取不到 RequestID,只能通过 http_method 字段检索 PUT 请求:
在查询结果中找到对应时间节点的记录,发现 Http 状态码为 408,请求超时:
既然请求超时了,为什么最终还能上传成功呢?通过查看源码发现添加了重试策略,默认最大重试次数 3 次,下图正是打印错误日志的代码:
所以最终得到的结论:
- 异常原因为请求超时。
- 发生异常后仍然成功是因为底层请求添加了重试策略,最多重试 3 次;如果最终结果上传失败,那就是达到重试次数上限后依然请求超时。
- 我这边只在一台云服务器上出现该情况,换了其它机器都没问题,暂时没找到原因。。。
解决方案:暂无
最后贴上分片上传的代码:
static final ExecutorService MULTIPART_UPLOAD_EXECUTOR = Executors.newFixedThreadPool(5);
/**
* 分片上传
*
* @param bucket bucket
* @param key 文件名
* @param file 要上传的文件
*
*/
public static void multipartUpload(OssProperties.BucketDetail bucket, String key, final File file) {
OSSClient ossClient = getOSSClient(bucket.getEndpoint());
try {
// 创建 InitiateMultipartUploadRequest 对象
InitiateMultipartUploadRequest request = new InitiateMultipartUploadRequest(bucket.getName(), key);
// 初始化分片
InitiateMultipartUploadResult uploadResult = ossClient.initiateMultipartUpload(request);
// 每个分片的大小,用于计算文件有多少个分片.单位为字节,默认 1M
long partSize = 1024L * 1024;
long fileLength = file.length();
// 分片号取值范围 1~10000,如果超出此范围 OSS 将返回 InvalidArgument 错误码
int partCount = (