自己安装ceph,然后封装amazon s3 接口写了一个对象存储服务。但是遇到一个问题,amazon s3 封装的文件上传对象 OssClient 不是线程安全的,导致当多个文件同时上传时,多线程再上传另一个文件,导致之前正在上传的资源丢失。
目前想到的解决办法是:设置线程工厂的资源丢弃策略,这是方案比较low。各位看官有什么想法和实现方案,可以留言交流。
在这里只是记录一下坑点。
private void save(ResourceType resourceType, MultipartFile file, String bucketName, ObjectType objectType, ObjectMetadata objMetadata, String objectKey) { //保存资源:多线程处理(注意,此处不是线程安全的) /* threadPoolExecutor.execute(() -> { });*/ ... ... ossClient.putObjectMultipart(new PutObjectRequest(bucketName, objectKey, inputStream, objMetadata) .withCannedAcl(CannedAccessControlList.PublicRead)); log.info("resource has been saved in OSS . resourceType: {},fileName:{}, fileSize:{},bucketName:{},objectType:{},objMetadata:{}.", resourceType .getResourceName(), file.getOriginalFilename(), file.getSize(), bucketName, objectType, objMetadata); }