Browse Source

rawData_realtime换成redis

master
review512jwy@163.com 1 month ago
parent
commit
e63aa1d310
  1. 3
      data-center-business-common/src/main/java/com/techsor/datacenter/business/common/Constants.java
  2. 180
      data-center-business-service/src/main/java/com/techsor/datacenter/business/service/impl/CommonServiceImpl.java
  3. 7
      data-center-business-util/src/main/java/com/techsor/datacenter/business/util/redis/RedisUtil.java

3
data-center-business-common/src/main/java/com/techsor/datacenter/business/common/Constants.java

@ -78,5 +78,8 @@ public class Constants {
public static final String RILI_API_TOKEN = "RILI_API_TOKEN";
public static final int REDIS_PARTITION_NUM = 100;
public static final String REDIS_RAW_DATA_REALTIME = "rawData_realtime:";
}

180
data-center-business-service/src/main/java/com/techsor/datacenter/business/service/impl/CommonServiceImpl.java

@ -421,56 +421,30 @@ public class CommonServiceImpl implements CommonService {
List<ApiDeviceInfoVO> deviceInfos = deviceInfoMapperExt.getInfo4QueryAssetInfo(DeviceParamMap);
// Query latest data and time if Aurora URL exists and devices are found
if (StringUtils.isNotBlank(apikeyInfo.getAuroraUrl()) && CollectionUtils.isNotEmpty(deviceInfos)) {
Class.forName("com.mysql.cj.jdbc.Driver");
String regex = "(jdbc:mysql://)([^/]+)(/data_center_aeon_admin.*)";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(dbUrl);
String newJdbcUrl = "";
if (matcher.find()) {
newJdbcUrl = matcher.replaceAll("$1" + apikeyInfo.getAuroraUrl() + "$3");
}
try (Connection conn = DriverManager.getConnection(
newJdbcUrl.replace("data_center_aeon_admin", "aeon") + "&allowPublicKeyRetrieval=true",
DESUtil.decrypt(apikeyInfo.getAuroraUsername(), Constants.DES_SALT),
DESUtil.decrypt(apikeyInfo.getAuroraPassword(), Constants.DES_SALT))) {
for (ApiDeviceInfoVO apiDeviceInfoVO : deviceInfos) {
String sql = "select rawData, receive_ts from rawData_realtime where deviceId = ? limit 1";
logger.info("queryAssetInfo aurora sql:" + sql);
try (PreparedStatement preparedStatement = conn.prepareStatement(sql)) {
preparedStatement.setString(1, apiDeviceInfoVO.getDeviceId());
String deviceId = apiDeviceInfoVO.getDeviceId();
// 计算分片
int partitionIndex = Math.abs(deviceId.hashCode()) % Constants.REDIS_PARTITION_NUM;
String redisKey = Constants.REDIS_RAW_DATA_REALTIME + partitionIndex;
// 从 Redis Hash 获取 JSON
Object redisData = redisUtil.HGet(redisKey, deviceId);
if (redisData != null) {
JSONObject jsonObject = JSON.parseObject(JSON.toJSONString(redisData), Feature.OrderedField);
Long receiveTs = jsonObject.getLong("receive_ts");
String rawData = jsonObject.getString("rawData");
ResultSet retult = preparedStatement.executeQuery();
while (retult.next()) {
String rawData = retult.getString("rawData");
Long receiveTs = retult.getLong("receive_ts");
apiDeviceInfoVO.setLatestDataTime(receiveTs);
apiDeviceInfoVO.setLatestRawData(rawData);
apiDeviceInfoVO.setLatestDataTime(receiveTs);
JSONObject jsonObject = JSON.parseObject(rawData, Feature.OrderedField);
// 遍历所有键值对
JSONObject rawDataObj = JSON.parseObject(rawData, Feature.OrderedField);
List<Object> valueList = new ArrayList<>();
for (String key : jsonObject.keySet()) {
valueList.add(jsonObject.get(key));
for (String key : rawDataObj.keySet()) {
valueList.add(rawDataObj.get(key));
}
apiDeviceInfoVO.setDataValue(StringUtils.join(valueList, ","));
}
preparedStatement.close();
}
}
conn.close();
} catch (Exception e) {
logger.error("queryAssetInfo aurora query error", e);
return SimpleDataResponse.fail(ResponseCode.SERVER_ERROR, ResponseCode.SERVER_ERROR_MSG);
}
}
//Set device info
@ -1495,46 +1469,31 @@ public class CommonServiceImpl implements CommonService {
}
//Query latest data from Aurora if configured and devices are found
if (StringUtils.isNotBlank(apikeyInfo.getAuroraUrl()) && CollectionUtils.isNotEmpty(dpfDeviceInfoVOs)) {
Class.forName("com.mysql.cj.jdbc.Driver");
String regex = "(jdbc:mysql://)([^/]+)(/data_center_aeon_admin.*)";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(dbUrl);
String newJdbcUrl = "";
if (matcher.find()) {
newJdbcUrl = matcher.replaceAll("$1" + apikeyInfo.getAuroraUrl() + "$3");
}
try (Connection conn = DriverManager.getConnection(
newJdbcUrl.replace("data_center_aeon_admin", "aeon") + "&allowPublicKeyRetrieval=true",
DESUtil.decrypt(apikeyInfo.getAuroraUsername(), Constants.DES_SALT),
DESUtil.decrypt(apikeyInfo.getAuroraPassword(), Constants.DES_SALT))) {
if (CollectionUtils.isNotEmpty(dpfDeviceInfoVOs)) {
for (ApiRiliDeviceInfoVO apiRiliDeviceInfoVO : dpfDeviceInfoVOs) {
String deviceId = apiRiliDeviceInfoVO.getDeviceId();
// 计算分片
int partitionIndex = Math.abs(deviceId.hashCode()) % Constants.REDIS_PARTITION_NUM;
String redisKey = Constants.REDIS_RAW_DATA_REALTIME + partitionIndex;
// 从 Redis Hash 获取 JSON
Object redisData = redisUtil.HGet(redisKey, deviceId);
if (redisData != null) {
JSONObject jsonObject = JSON.parseObject(JSON.toJSONString(redisData), Feature.OrderedField);
Long receiveTs = jsonObject.getLong("receive_ts");
String rawData = jsonObject.getString("rawData");
Map<String, Object> categoryIdSearchMap = new HashMap<>();
categoryIdSearchMap.put("deviceId", apiRiliDeviceInfoVO.getDeviceId());
Long deviceCategoryId = deviceInfoMapperExt.getDeviceCategoryId(categoryIdSearchMap);
String baseSql = "SELECT rawData, receive_ts FROM rawData_realtime WHERE deviceId = ? LIMIT 1";
// String sql = String.format(baseSql, formatRawDataWithDate(LocalDate.now(), deviceCategoryId));
String sql = baseSql;
logger.info("queryDeviceInfo aurora sql: {}", sql);
try (PreparedStatement preparedStatement = conn.prepareStatement(sql)) {
preparedStatement.setString(1, apiRiliDeviceInfoVO.getDeviceId());
try (ResultSet result = preparedStatement.executeQuery()) {
apiRiliDeviceInfoVO.setLatestRawData(rawData);
apiRiliDeviceInfoVO.setLatestDataTime(receiveTs);
if (result.next()) {
processResult(result, apiRiliDeviceInfoVO);
}
}
// 遍历所有键值对
JSONObject rawDataObj = JSON.parseObject(rawData, Feature.OrderedField);
List<Object> valueList = new ArrayList<>();
for (String key : rawDataObj.keySet()) {
valueList.add(rawDataObj.get(key));
}
apiRiliDeviceInfoVO.setDataValue(StringUtils.join(valueList, ","));
}
} catch (Exception e) {
logger.error("queryDeviceInfo processing aurora error", e);
return SimpleDataResponse.fail(ResponseCode.SERVER_ERROR, ResponseCode.SERVER_ERROR_MSG, new ArrayList<>());
}
}
}
@ -2059,40 +2018,23 @@ public class CommonServiceImpl implements CommonService {
//Query latest data from Aurora if configured and devices are found
if (StringUtils.isNotBlank(apikeyInfo.getAuroraUrl()) && CollectionUtils.isNotEmpty(deviceInfoVOs)) {
Class.forName("com.mysql.cj.jdbc.Driver");
String regex = "(jdbc:mysql://)([^/]+)(/data_center_aeon_admin.*)";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(dbUrl);
String newJdbcUrl = "";
if (matcher.find()) {
newJdbcUrl = matcher.replaceAll("$1" + apikeyInfo.getAuroraUrl() + "$3");
}
try (Connection conn = DriverManager.getConnection(
newJdbcUrl.replace("data_center_aeon_admin", "aeon") + "&allowPublicKeyRetrieval=true",
DESUtil.decrypt(apikeyInfo.getAuroraUsername(), Constants.DES_SALT),
DESUtil.decrypt(apikeyInfo.getAuroraPassword(), Constants.DES_SALT))) {
if (CollectionUtils.isNotEmpty(deviceInfoVOs)) {
for (ApiCancelAlarmDeviceInfoVO apiCancelAlarmDeviceInfoVO : deviceInfoVOs) {
// String sql = " select rawData, receive_ts, alertTitle, alertLevel,alertLevelName,alertTypeName from "+formatRawDataWithDate()+" where deviceId = '" + apiAlarmDeviceInfoVO.getDeviceId() + "' order by receive_ts desc limit 1" ;
// String sql = " select rawData, receive_ts, alertTitle, alertLevel, alertTypeName from "+formatRawDataWithDate()+" where deviceId = '" + apiAlarmDeviceInfoVO.getDeviceId() + "' order by receive_ts desc limit 1" ;
String sql = "select rawData, receive_ts, alertCancelTitle, alertLevel, alertLevelName, alertTypeName from rawData_realtime where deviceId = ? limit 1";
logger.info("queryAlarmDevice aurora sql: " + sql);
try (PreparedStatement preparedStatement = conn.prepareStatement(sql)) {
preparedStatement.setString(1, apiCancelAlarmDeviceInfoVO.getDeviceId());
ResultSet retult = preparedStatement.executeQuery();
while (retult.next()) {
String rawData = retult.getString("rawData");
Long receiveTs = retult.getLong("receive_ts");
String alertLevel = retult.getString("alertLevel");
String alertLevelName = retult.getString("alertLevelName");
String alertCancelTitle = retult.getString("alertCancelTitle");
String alertTypeName = retult.getString("alertTypeName");
String deviceId = apiCancelAlarmDeviceInfoVO.getDeviceId();
// 计算分片
int partitionIndex = Math.abs(deviceId.hashCode()) % Constants.REDIS_PARTITION_NUM;
String realtimeRedisKey = Constants.REDIS_RAW_DATA_REALTIME + partitionIndex;
// 从 Redis Hash 获取 JSON
Object redisData = redisUtil.HGet(realtimeRedisKey, deviceId);
if (redisData != null) {
JSONObject jsonObject = JSON.parseObject(JSON.toJSONString(redisData), Feature.OrderedField);
Long receiveTs = jsonObject.getLong("receive_ts");
String rawData = jsonObject.getString("rawData");
String alertLevel = jsonObject.getString("alertLevel");
String alertLevelName = jsonObject.getString("alertLevelName");
String alertCancelTitle = jsonObject.getString("alertCancelTitle");
String alertTypeName = jsonObject.getString("alertTypeName");
apiCancelAlarmDeviceInfoVO.setLatestDataTime(receiveTs);
apiCancelAlarmDeviceInfoVO.setLatestRawData(rawData);
apiCancelAlarmDeviceInfoVO.setAlertLevel(alertLevel);
@ -2100,28 +2042,14 @@ public class CommonServiceImpl implements CommonService {
apiCancelAlarmDeviceInfoVO.setAlertTypeName(alertTypeName);
apiCancelAlarmDeviceInfoVO.setAlertLevelName(alertLevelName);
JSONObject jsonObject = JSON.parseObject(rawData,Feature.OrderedField);
// 遍历所有键值对
JSONObject rawDataObj = JSON.parseObject(rawData, Feature.OrderedField);
List<Object> valueList = new ArrayList<>();
for (String key : jsonObject.keySet()) {
valueList.add(jsonObject.get(key));
for (String key : rawDataObj.keySet()) {
valueList.add(rawDataObj.get(key));
}
apiCancelAlarmDeviceInfoVO.setDataValue(StringUtils.join(valueList, ","));
}
preparedStatement.close();
}
}
conn.close();
} catch (Exception e) {
logger.error("queryAlarmDevice processing aurora error", e);
return SimpleDataResponse.fail(ResponseCode.SERVER_ERROR, ResponseCode.SERVER_ERROR_MSG);
} finally {
DataSourceContextHolder.clearCurrentDataSourceKey();
if (jedis != null) {
// Close Jedis connection
jedis.close();
}
}
}
}

7
data-center-business-util/src/main/java/com/techsor/datacenter/business/util/redis/RedisUtil.java

@ -7,6 +7,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.InvalidDataAccessApiUsageException;
import org.springframework.data.redis.core.*;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
@ -40,8 +41,12 @@ public class RedisUtil {
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
ObjectMapper om = new ObjectMapper();
om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
// om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
jackson2JsonRedisSerializer.setObjectMapper(om);
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setHashKeySerializer(new StringRedisSerializer());
redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);
this.redisTemplate = redisTemplate;

Loading…
Cancel
Save