优化交换机分表、新增丢包率clientId记录

This commit is contained in:
gaoyutao
2025-11-24 14:00:49 +08:00
parent c6e778c74e
commit c0f51ef007
17 changed files with 718 additions and 86 deletions
@@ -1,28 +1,50 @@
package com.ruoyi.common.core.utils;
import org.springframework.stereotype.Component;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.ResultSet;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.LinkedHashSet;
import java.util.Set;
@Component
public class TableSubUtil {
// 日期格式
private static final String YEAR_MONTH_FORMAT = "yyyy_MM";
private static final String DATE_TIME_FORMAT = "yyyy-MM-dd HH:mm:ss";
/**
* 根据创建时间获取表名
* @param createTime 记录创建时间
* @param prefix 表名前缀
* @return 对应的分表名称
* @throws IllegalArgumentException 如果createTime为null
*
* 示例:
* 2023-08-05 14:30:00 → rm_mtr_probe_result_2023_08_1_10
* 2023-08-15 09:15:00 → rm_mtr_probe_result_2023_08_11_20
* 2023-08-25 18:45:00 → rm_mtr_probe_result_2023_08_21_31
* 根据创建时间获取表名(过滤不存在的表)
*/
public static String getExistingTableName(Date createTime, String prefix) {
String tableName = getTableName(createTime, prefix);
return tableExists(tableName) ? tableName : null;
}
/**
* 获取时间范围内涉及的所有存在的表名
*/
public static Set<String> getExistingTableNamesBetween(String startTime, String endTime, String prefix) {
Set<String> allTables = getTableNamesBetween(startTime, endTime, prefix);
Set<String> existingTables = new LinkedHashSet<>();
for (String table : allTables) {
if (tableExists(table)) {
existingTables.add(table);
}
}
return existingTables;
}
/**
* 根据创建时间获取表名(原始方法)
*/
public static String getTableName(Date createTime, String prefix) {
if (createTime == null) {
@@ -35,18 +57,11 @@ public class TableSubUtil {
SimpleDateFormat dayFormat = new SimpleDateFormat("dd");
int day = Integer.parseInt(dayFormat.format(createTime));
return String.format("%s_%s_%s",
prefix,
yearMonth,
getDayRange(day));
return String.format("%s_%s_%s", prefix, yearMonth, getDayRange(day));
}
/**
* 获取时间范围内涉及的所有表名
* @param startTime 开始时间 (格式: "yyyy-MM-dd HH:mm:ss")
* @param endTime 结束时间 (格式: "yyyy-MM-dd HH:mm:ss")
* @param prefix 表名前缀
* @return 按时间顺序排列的表名集合
* 获取时间范围内涉及的所有表名(原始方法)
*/
public static Set<String> getTableNamesBetween(String startTime, String endTime, String prefix) {
Date start = parseDateTime(startTime);
@@ -54,27 +69,45 @@ public class TableSubUtil {
validateTimeRange(start, end);
Set<String> tableNames = new LinkedHashSet<>();
// 使用java.util.Calendar进行日期操作
java.util.Calendar current = java.util.Calendar.getInstance();
Calendar current = Calendar.getInstance();
current.setTime(start);
current.set(java.util.Calendar.HOUR_OF_DAY, 0);
current.set(java.util.Calendar.MINUTE, 0);
current.set(java.util.Calendar.SECOND, 0);
current.set(java.util.Calendar.MILLISECOND, 0);
current.set(Calendar.HOUR_OF_DAY, 0);
current.set(Calendar.MINUTE, 0);
current.set(Calendar.SECOND, 0);
current.set(Calendar.MILLISECOND, 0);
java.util.Calendar endCal = java.util.Calendar.getInstance();
Calendar endCal = Calendar.getInstance();
endCal.setTime(end);
while (!current.after(endCal)) {
tableNames.add(getTableName(current.getTime(), prefix));
current.add(java.util.Calendar.DAY_OF_MONTH, 1);
current.add(Calendar.DAY_OF_MONTH, 1);
}
return tableNames;
}
// 解析字符串为Date
/**
* 检查表是否存在
*/
private static boolean tableExists(String tableName) {
try {
// 直接从SpringUtils获取数据源
javax.sql.DataSource dataSource = SpringUtils.getBean(javax.sql.DataSource.class);
try (Connection conn = dataSource.getConnection()) {
DatabaseMetaData metaData = conn.getMetaData();
try (ResultSet rs = metaData.getTables(conn.getCatalog(), null, tableName, new String[]{"TABLE"})) {
return rs.next();
}
}
} catch (Exception e) {
System.err.println("检查表是否存在失败: " + tableName + ", error: " + e.getMessage());
return false;
}
}
// 以下为原有辅助方法保持不变
private static Date parseDateTime(String dateTimeStr) {
if (dateTimeStr == null || dateTimeStr.trim().isEmpty()) {
throw new IllegalArgumentException("时间字符串不能为空");
@@ -87,18 +120,15 @@ public class TableSubUtil {
}
}
// 获取日期区间
private static String getDayRange(int day) {
if (day < 1 || day > 31) {
throw new IllegalArgumentException("日期必须在1-31之间");
}
if (day <= 10) return "1_10";
if (day <= 20) return "11_20";
return "21_31";
}
// 验证时间范围
private static void validateTimeRange(Date start, Date end) {
if (start == null || end == null) {
throw new IllegalArgumentException("时间范围参数不能为null");