xx-job凌晨一点清除oss指定文件夹以及指定保留时间的文件

ps:文件下面还有文件夹,这代码不能完全保证是否遍历到所有该文件夹以及子文件夹的文件,因为不可能一点点上到服务器去数,只是代码上做到应该不会出现重复的文件夹以及出现死循环

 public static void main(String[] args) {long startTime = System.currentTimeMillis();System.out.println("CleanOssFileHandler凌晨一点清除的指定文件夹的文件开始执行时间:"+startTime);//通过传入一个字符串参数,不同文件夹通过;来分割,每个文件夹的又通过|分割不同的参数,第一个参数是文件夹,第二个参数是保留天数,第三个参数是清除的文件类型String params = "exportFile/|7|xls,zip;docfile/|7|xls,zip";if (StrKit.isBlank(params)) {return;}String endpoint = getAccessKey().get("endpoint") + "";//"oss-cn-beijing.aliyuncs.com";String accessKeyId = getAccessKey().get("ossaccessKeyId") + "";String accessKeySecret = getAccessKey().get("ossaccessKeySecret") + "";String bucketName = getAccessKey().get("bucketName") + "";// 创建 OSS 客户端实例OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);String[] split = params.split(";");Set<String> filePath = new HashSet<>();Set<String> foldPath = new HashSet<>();for (String param : split) {String[] split1 = param.split("\\|");if (split1.length<3){return;}//保留天数int days = Integer.parseInt(split1[1]);//保留天数转换成毫米long millis = TimeUnit.DAYS.toMillis(days);//获取文件类型String fileType = split1[2];//指定文件目录String directory = split1[0];deleteflieByFolderPath(directory,bucketName,ossClient,millis,fileType,filePath,foldPath);}long endTime = System.currentTimeMillis();System.out.println("CleanOssFileHandler凌晨一点清除的指定文件夹的文件开始结束时间:" +endTime);System.out.println("CleanOssFileHandler凌晨一点清除的指定文件夹的文件本次执行花费时间为:" +(endTime-startTime));System.out.println(filePath.size());System.out.println(foldPath.size());//关闭 OSS 客户端ossClient.shutdown();}
//获取文件夹下的文件public  static void deleteflieByFolderPath(String path,String bucketName,OSS ossClient,long millis,String fileType, Set<String> filePath,Set<String> forlderPath){//获取文件夹ListObjectsRequest listObjectsRequest1 = new ListObjectsRequest(bucketName);listObjectsRequest1.setPrefix(path);listObjectsRequest1.setMaxKeys(1000); // 设置每次返回的最大文件数,默认值为1000listObjectsRequest1.withDelimiter("/");ObjectListing objectListing1 = ossClient.listObjects(listObjectsRequest1);List<OSSObjectSummary> objectSummaries = objectListing1.getObjectSummaries();if (CollectionUtil.isNotEmpty(objectSummaries)){for (OSSObjectSummary s : objectSummaries) {String key = "oss的域名" + s.getKey();int length = key.length();int i = key.lastIndexOf("/") + 1;if (i != length) {File file = new File(key);String fileType1 = file.getName().split("\\.")[1];System.out.println(s.getLastModified());if (DateUtils.getCurrentTime() - s.getLastModified().getTime() > millis&&fileType.contains(fileType1)) {System.out.println(key);//这里为了测试是否有相同的文件if (filePath.contains(key)){System.out.println("重复的文件!!!");return;}filePath.add(key);fileDelete(key);}}}}for (String commonPrefix : objectListing1.getCommonPrefixes()) {if (commonPrefix.contains("//")){continue;}//这里为了测试是否有相同的文件夹if (forlderPath.contains(commonPrefix)){return;}forlderPath.add(commonPrefix);deleteflieByFolderPath(commonPrefix,bucketName,ossClient,millis,fileType,filePath,forlderPath);}}private static   Map<String,Object> getAccessKey() {Properties properties = new Properties();Map<String, Object> data = new HashMap<>();try {ClassPathResource resource = new ClassPathResource("\\xx.properties");properties = PropertiesLoaderUtils.loadProperties(resource);if (properties.get("ossaccessKeyId")==null||"".equals(properties.get("ossaccessKeyId"))){throw new AposException(9999, "ossaccessKeyId不能为空!");}if (properties.get("ossaccessKeySecret")==null||"".equals(properties.get("ossaccessKeySecret"))){throw new AposException(9999, "ossaccessKeySecret不能为空!");}if (properties.get("endpoint")==null||"".equals(properties.get("endpoint"))){throw new AposException(9999, "endpoint不能为空!");}if (properties.get("bucketName")==null||"".equals(properties.get("bucketName"))){throw new AposException(9999, "bucketName!");}data.put("endpoint",properties.get("endpoint"));data.put("bucketName",properties.get("bucketName"));data.put("ossaccessKeyId",properties.get("ossaccessKeyId"));data.put("ossaccessKeySecret",properties.get("ossaccessKeySecret"));} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}return data;}/*** 删除指定文件* @param* @return*/public static  void fileDelete(String ossUrl) {String endpoint = getAccessKey().get("endpoint")+"";//"oss-cn-beijing.aliyuncs.com";String accessKeyId = getAccessKey().get("ossaccessKeyId")+"";;String accessKeySecret =  getAccessKey().get("ossaccessKeySecret")+"";String bucketName = getAccessKey().get("bucketName")+"";// 填写文件完整路径。文件完整路径中不能包含Bucket名称。String objectName = ossUrl;//String yuming = http+bucketName+"."+ endpoint+"/";// 创建OSSClient实例。OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);objectName = objectName.replace("域名","");try {boolean b = ossClient.doesObjectExist(bucketName, objectName);// 删除文件或目录。如果要删除目录,目录必须为空。if (!b){System.out.println("文件已删除");}ossClient.deleteObject(bucketName, objectName);} catch (OSSException oe) {throw new ServiceException("文件删除失败:"+oe.getErrorMessage());} finally {if (ossClient != null) {ossClient.shutdown();}}}

最后本地测试的结果:
在这里插入图片描述
大概两万个文件,需要花费四五分钟。(没包括删除的时间)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/115909.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java服务内存说明及配置详解

java进程内存 JVM内存分布图: 【java进程内存】【堆外内存】 【jvm堆内存】 【堆外内存】 【Metaspace】 【Direct Memory】【JNI Memory】【code_cache】 … 堆外内存泄漏的排查在于【本地内存&#xff08;Native Memory&#xff09;】【Direct Memory】【JNI Memory】 一般…

如何利用物联网技术打造新型智能餐饮连锁店

中国是美食大国&#xff0c;餐饮美食的消费需求庞大&#xff0c;随着餐饮产业的标准化、规模化发展&#xff0c;餐饮店的连锁化率在持续上升&#xff0c;许多餐饮知名品牌都开设了成百上千家连锁店。随着餐饮连锁店数量的增加&#xff0c;对品牌店铺的管理和运营难度也日益增长…

Klocwork 2023.2 windows

Klocwork 2023.2 windows 2692407267qq.com&#xff0c;更多内容请见http://user.qzone.qq.com/2692407267/

若依框架集成WebSocket带用户信息认证

一、WebSocket 基础知识 我们平时前后台请求用的最多的就是 HTTP/1.1协议&#xff0c;它有一个缺陷&#xff0c; 通信只能由客户端发起&#xff0c;如果想要不断获取服务器信息就要不断轮询发出请求&#xff0c;那么如果我们需要服务器状态变化的时候能够主动通知客户端就需要用…

《开发实战》15 | 接口设计:系统间对话的语言,一定要统一

接口的响应要明确表示接口的处理结果 我曾遇到过一个处理收单的收单中心项目&#xff0c;下单接口返回的响应体中&#xff0c;包含了 success、code、info、message 等属性&#xff0c;以及二级嵌套对象 data 结构体。在对项目进行重构的时候&#xff0c;我们发现真的是无从入…

海外代理IP是什么?如何使用?

一、海外代理IP是什么&#xff1f; 首先&#xff0c;代理服务器是在用户和互联网之间提供网关的系统或路由器。它是一个服务器&#xff0c;被称为“中介”&#xff0c;因为它位于最终用户和他们在线访问的网页之间。 海外IP代理是就是指从海外地区获取的IP地址&#xff0c;用…

redis实战-实现笔记点赞和点赞排行榜

发布探店笔记 探店笔记类似点评网站的评价&#xff0c;往往是图文结合。对应的表有两个&#xff1a; tb_blog&#xff1a;探店笔记表&#xff0c;包含笔记中的标题、文字、图片等 tb_blog_comments&#xff1a;其他用户对探店笔记的评价 保存笔记service层 Overridepublic Re…

【AI语言大模型】文心一言功能使用介绍

一、前言 文心一言是一个知识增强的大语言模型&#xff0c;基于飞桨深度学习平台和文心知识增强大模型&#xff0c;持续从海量数据和大规模知识中融合学习具备知识增强、检索增强和对话增强的技术特色。 最近收到百度旗下产品【文心一言】的产品&#xff0c;抱着试一试的心态体…

【自学开发之旅】Flask-会话保持-API授权-注册登录

http - 无状态-无法记录是否已经登陆过 #会话保持 – session cookie session – 保存一些在服务端 cookie – 保存一些数据在客户端 session在单独服务器D上保存&#xff0c;前面数个服务器A,B,C上去取就好了&#xff0c;业务解耦。—》》现在都是基于token的验证。 以上是基…

SpringCloud Alibaba - Sentinel篇

一、Sentinel快速入门 Sentinel官网地址&#xff1a;https://sentinelguard.io/zh-cn/index.html Sentinel项目地址&#xff1a;https://github.com/alibaba/Sentinel Sentinel是阿里巴巴开源的一款微服务流量治理组件&#xff0c;主要以流量为切入点&#xff0c;从流量限流、熔…

电子信息工程专业课复习知识点总结:(五)通信原理

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 第一章通信系统概述——通信系统的构成、各部分性质、性能指标1.通信系统的组成&#xff1f;2.通信系统的分类&#xff1f;3.调制、解调是什么&#xff1f;有什么用…

抖 X-Bongus 参数逆向 python案例实战

前言 嗨喽~大家好呀&#xff0c;这里是魔王呐 ❤ ~! python更多源码/资料/解答/教程等 点击此处跳转文末名片免费获取 知识点&#xff1a; 动态数据抓包 requests发送请求 X-Bogus 参数逆向 开发环境: python 3.8 运行代码 pycharm 2022.3 辅助敲代码 requests pip ins…