1.依赖
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.6.6</version>
</dependency>
2.核心代码
public Map<String, Object> queryDiskSpaceDataByPath(String path) {
File file = new File(path);
long totalSpace = file.getTotalSpace();
long freeSpace = file.getFreeSpace();
long freeSpaceLong = freeSpace / 1024 / 1024 / 1024;
long totalSpaceLong = totalSpace / 1024 / 1024 / 1024;
double freeRate = 0.0;
if (totalSpaceLong > 1) {
freeRate = freeSpaceLong * 1.0 / totalSpaceLong * 100;
}
Map<String, Object> diskDataMap = new HashMap<>(4);
diskDataMap.put("path", path);
diskDataMap.put("diskSpace", "磁盘剩余及总大小[" + freeSpaceLong + "G/" + totalSpaceLong + "G]");
diskDataMap.put("diskUsageRate", "磁盘剩余率[" + String.format("%.2f", freeRate) + "%]");
return diskDataMap;
}
public boolean toDetermineIfTableNeedsToBeClearedUp(Map<String, Object> partitionDataMap, int retentionYears) {
String partitionType = MapUtils.getString(partitionDataMap, "partitionType");
String partitionMin = MapUtils.getString(partitionDataMap, "partitionMin");
long differenceValue = getDateDifferenceValueByParam(partitionType, partitionMin);
boolean isToBe = determineIfTableNeedsToBeClearedUp(partitionType, differenceValue, retentionYears);
partitionDataMap.put("isToClearedUp", isToBe);
return isToBe;
}
private long getDateDifferenceValueByParam(String type, String min) {
long differenceValue = 0;
switch (type) {
case "year":
differenceValue = DateUtil.betweenYear(new Date(), DateUtil.parse(min, "yyyy"), false);
break;
case "month":
differenceValue = DateUtil.betweenMonth(new Date(), DateUtil.parse(min, "yyyyMM"), false);
break;
case "day":
differenceValue = DateUtil.betweenDay(new Date(), DateUtil.parse(min, "yyyyMMdd"), false);
break;
default:
break;
}
return differenceValue;
}
private boolean determineIfTableNeedsToBeClearedUp(String type, long differenceValue, int retentionYears) {
boolean isToBe = false;
switch (type) {
case "year":
isToBe = differenceValue > retentionYears;
break;
case "month":
isToBe = differenceValue > (retentionYears * 12);
break;
case "day":
isToBe = differenceValue > (retentionYears * 365);
break;
default:
break;
}
return isToBe;
}
public String getAdjustmentPartitionName(Map<String, Object> partitionDataMap, int retentionYears) {
String partitionType = MapUtils.getString(partitionDataMap, "partitionType");
String partitionPrefix = MapUtils.getString(partitionDataMap, "partitionPrefix");
String partitionMax = MapUtils.getString(partitionDataMap, "partitionMax");
String adjustmentPartition = getAdjustmentPartitionName(partitionType, partitionMax, retentionYears);
return partitionPrefix + adjustmentPartition;
}
- 生成要清理的分区列表【需要删除的分区不包含临界分区】
public List<String> getClearedUpPartitionTableNames(Map<String, Object> partitionDataMap, int retentionYears) {
String partitionType = MapUtils.getString(partitionDataMap, "partitionType");
String partitionMin = MapUtils.getString(partitionDataMap, "partitionMin");
String partitionMax = MapUtils.getString(partitionDataMap, "partitionMax");
String adjustmentPartition = getAdjustmentPartitionName(partitionType, partitionMax, retentionYears);
return getClearedUpListByParam(partitionType, adjustmentPartition, partitionMin);
}
private String getAdjustmentPartitionName(String type, String partitionMax, int retentionYears) {
String adjustPartitionName = "";
switch (type) {
case "year":
adjustPartitionName = DateUtil.format(DateUtil.offsetDay(DateUtil.parse(partitionMax, "yyyy"), -365 * retentionYears), "yyyy");
break;
case "month":
adjustPartitionName = DateUtil.format(DateUtil.offsetDay(DateUtil.parse(partitionMax, "yyyyMM"), -365 * retentionYears), "yyyyMM");
break;
case "day":
adjustPartitionName = DateUtil.format(DateUtil.offsetDay(DateUtil.parse(partitionMax, "yyyyMMdd"), -365 * retentionYears), "yyyyMMdd");
break;
default:
break;
}
return adjustPartitionName;
}
private List<String> getClearedUpListByParam(String type, String partitionMax, String partitionMin) {
List<String> clearedUpList = new ArrayList<>();
switch (type) {
case "year":
LocalDateTime startYear = LocalDateTime.of(Integer.parseInt(partitionMin), 1, 1, 0, 0);
LocalDateTime endYear = LocalDateTime.of(Integer.parseInt(partitionMax), 1, 1, 0, 0);
long numOfYearsBetween = ChronoUnit.YEARS.between(startYear, endYear) - 1;
if (numOfYearsBetween >= 0) {
for (long i = 0; i <= numOfYearsBetween; i++) {
clearedUpList.add("p_year_" + DateUtil.format(startYear.plusYears(i), "yyyy"));
}
}
break;
case "month":
LocalDateTime startMonth = LocalDateTime.of(Integer.parseInt(partitionMin.substring(0, 4)), Integer.parseInt(partitionMin.substring(4)), 1, 0, 0);
LocalDateTime endMonth = LocalDateTime.of(Integer.parseInt(partitionMax.substring(0, 4)), Integer.parseInt(partitionMax.substring(4)), 1, 0, 0);
long numOfMonthsBetween = ChronoUnit.MONTHS.between(startMonth, endMonth) - 1;
if (numOfMonthsBetween >= 0) {
for (long i = 0; i <= numOfMonthsBetween; i++) {
clearedUpList.add("p_month_" + DateUtil.format(startMonth.plusMonths(i), "yyyyMM"));
}
}
break;
case "day":
LocalDateTime startDay = LocalDateTime.of(Integer.parseInt(partitionMin.substring(0, 4)), Integer.parseInt(partitionMin.substring(4, 6)), Integer.parseInt(partitionMin.substring(6)), 0, 0);
LocalDateTime endDay = LocalDateTime.of(Integer.parseInt(partitionMax.substring(0, 4)), Integer.parseInt(partitionMax.substring(4, 6)), Integer.parseInt(partitionMax.substring(6)), 0, 0);
long numOfDaysBetween = ChronoUnit.DAYS.between(startDay, endDay) - 1;
if (numOfDaysBetween >= 0) {
for (long i = 0; i <= numOfDaysBetween; i++) {
clearedUpList.add("p_day_" + DateUtil.format(startDay.plusDays(i), "yyyyMMdd"));
}
}
break;
default:
break;
}
return clearedUpList;
}
3.用到的核心类
- java.time.temporal.ChronoUnit【这个类之前用的很少】
- cn.hutool.core.date.DateUtil【hutool工具箱的时间工具】