作者 钟来

解决现网禄辉接口请求超时问题

... ... @@ -2,7 +2,6 @@ package com.zhonglai.luhui.api;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
... ...
... ... @@ -8,15 +8,13 @@ import com.zhonglai.luhui.api.controller.data.SensorData;
import com.zhonglai.luhui.api.controller.data.TableGenerateSqlEnum;
import com.zhonglai.luhui.api.mapper.DeviceSensorDataMapper;
import com.zhonglai.luhui.dao.mapper.PublicMapper;
import com.zhonglai.luhui.datasource.config.DynamicDataSourceContextHolder;
import com.zhonglai.luhui.datasource.enums.DataSource;
import com.zhonglai.luhui.datasource.enums.DataSourceType;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.lang.reflect.Field;
import java.text.SimpleDateFormat;
import java.util.*;
@Service
... ... @@ -27,7 +25,6 @@ public class DataService {
@Autowired
public DeviceSensorDataMapper deviceSensorDataMapper;
@DataSource(value = DataSourceType.SLAVE)
public Map<String,Object> getViewDataBeifen(Integer dateTime,String id,String data_type)
{
... ... @@ -273,7 +270,15 @@ public class DataService {
return "取点颗粒必须是10的整数倍,并且不能小于10";
}
int nowTime = getBeforeDawnTimeMilly(DateUtils.getNowTimeMilly()); //当天凌晨时间
int nowTime = DateUtils.getBeforeDawnTimeMilly(DateUtils.getNowTimeMilly()); //当天凌晨时间
// 计算当前时间的1年后的秒
long twoYearsLater = nowTime + (365 * 24 * 60 * 60 );
if (endTime > twoYearsLater) {
response.setStatus(500);
return "只能查看1年之内的数据,要查看更多数据请联系管理员";
}
StringBuffer sb = new StringBuffer();
if(nowTime>startTime)
... ... @@ -285,14 +290,6 @@ public class DataService {
}
}
if(endTime > nowTime)
{
StringBuffer sbafter = getDeviceTimeData(deviceInfoId,dataType,new Date(endTime*1000l),interval*60);
if(null != sbafter)
{
sb.append(sbafter);
}
}
return sb.toString();
}
... ... @@ -303,85 +300,34 @@ public class DataService {
* @param dataType
* @return
*/
@DataSource(value = DataSourceType.SLAVE)
public StringBuffer getBeifeiDbDeviceHistoryData(String deviceInfoId,String dataType,int startTime,int endTime,int interval)
{
DynamicDataSourceContextHolder.setDataSourceType(DataSourceType.SLAVE.name());
List<Map<String,Object>> list = publicMapper.getObjectListBySQL("SELECT count(*) ct FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA='ly-device-data' and TABLE_NAME='"+deviceInfoId+"-"+dataType+"'");
List<String> tableNames = getTableNames(startTime, endTime);
// 每次查询的最大天数,超过则分批查询
int BATCH_QUERY_DAYS = 30;
if(null != list && list.size() !=0 && null != list.get(0) && null != list.get(0).get("ct") && (list.get(0).get("ct")+"").equals("1"))
if(null != tableNames && tableNames.size() !=0 && null != tableNames.get(0) )
{
list = publicMapper.getObjectListBySQL("select *,(`time` % "+interval+") asb from `ly-device-data`.`"+deviceInfoId+"-"+dataType+"` where ((`time` % "+interval+")=0 OR `value`<>'') AND `time`>="+startTime+" and `time`<="+endTime+" order by `time` asc");
if(null != list && list.size() !=0 )
{
StringBuffer sb = new StringBuffer();
List<DeviceSensorData> deviceSensorDataList = new ArrayList<>();
for(int i=0;i<list.size();i++)
{
Map<String,Object> map = list.get(i);
if(StringUtils.isNotEmpty((String)map.get("value")))
{
sb.append(map.get("time"));
sb.append(",");
sb.append(map.get("value"));
sb.append("\r\n");
}else{
String svalue = (String) map.get("value");
Long sasb = 0l;
if (i-1>=0)
{
// **分批查询**(一次最多查 30 天)
for (int i = 0; i < tableNames.size(); i += BATCH_QUERY_DAYS) {
int batchStart = i;
int batchEnd = Math.min(i + BATCH_QUERY_DAYS, tableNames.size());
List<String> batchTables = tableNames.subList(batchStart, batchEnd);
String object = (String) list.get(i-1).get("value");
if((Long) list.get(i-1).get("asb")!=0 && !"".equals(object)){
svalue = object;
sasb = (Long) list.get(i-1).get("asb");
}
}
String xvalue = (String) map.get("value");
Long xasb = 0l;
if (i+1<list.size())
{
String object = (String) list.get(i+1).get("value");
if((Long) list.get(i+1).get("asb")!=0 && !"".equals(object)){
xvalue = object;
xasb = (Long) list.get(i+1).get("asb");
}
}
if(!"".equals(svalue) && !"".equals(xvalue) )
{
if(sasb-xasb>=0)
{
sb.append(map.get("time"));
sb.append(",");
sb.append(xvalue);
sb.append("\r\n");
}else {
sb.append(map.get("time"));
sb.append(",");
sb.append(svalue);
sb.append("\r\n");
}
}else{
sb.append(map.get("time"));
sb.append(",");
sb.append( svalue+""+xvalue);
sb.append("\r\n");
}
}
}
// 销毁数据源 在执行方法之后
DynamicDataSourceContextHolder.clearDataSourceType();
return sb;
List<DeviceSensorData> tempDataList = queryBatchTables(batchTables, deviceInfoId, dataType, startTime, endTime);
deviceSensorDataList.addAll(tempDataList);
}
if(null != deviceSensorDataList && deviceSensorDataList.size()!=0)
{
//间隔时间补全
Date sdate = new Date(startTime*1000l);
String day = DateUtils.parseDateToStr("yyyyMMdd",sdate);
StringBuffer stringBuffer10 = SensorData.deviceSensorDataListToIntervalCompletion(deviceSensorDataList, Integer.parseInt(sdate.getTime() / 1000 + ""), interval, day);
return stringBuffer10;
}
}
// 销毁数据源 在执行方法之后
DynamicDataSourceContextHolder.clearDataSourceType();
return null;
}
... ... @@ -466,4 +412,45 @@ public class DataService {
CaseFormat toFormat = CaseFormat.LOWER_UNDERSCORE;
return fromFormat.to(toFormat, s);
}
/**
* 根据 startTime 和 endTime 计算查询的表名列表
*/
private List<String> getTableNames(int startTime, int endTime) {
List<String> tableNames = new ArrayList<>();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis((long) startTime * 1000);
while (startTime <= endTime) {
tableNames.add(TableGenerateSqlEnum.DeviceSensorData.getTableName(sdf.format(calendar.getTime())));
calendar.add(Calendar.DAY_OF_MONTH, 1);
startTime += 86400; // 加一天(秒)
}
return tableNames;
}
/**
* 查询一批表的数据
*/
private List<DeviceSensorData> queryBatchTables(List<String> tableNames, String deviceInfoId, String dataType, int startTime, int endTime) {
StringBuilder sqlBuilder = new StringBuilder();
for (int i = 0; i < tableNames.size(); i++) {
if (i > 0) {
sqlBuilder.append(" UNION ALL ");
}
sqlBuilder.append("SELECT device_info_id, data_type, data_value, creat_time FROM ")
.append(tableNames.get(i))
.append(" WHERE device_info_id = '"+deviceInfoId+"' AND data_type = '"+dataType+"' AND creat_time BETWEEN "+startTime+" AND "+endTime);
}
sqlBuilder.append(" ORDER BY creat_time ASC");
// **执行 SQL 查询**
List<DeviceSensorData> deviceSensorDataList = deviceSensorDataMapper.getDeviceSensorDataList(sqlBuilder.toString());
return deviceSensorDataList;
}
}
... ...
... ... @@ -12,10 +12,10 @@ spring:
# 从库数据源
slave:
# 从数据源开关/默认关闭
enabled: true
url: jdbc:mysql://rm-wz9a3l0g7cjysv8054o.mysql.rds.aliyuncs.com:3306/ly-device-data?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
username: luhui
password: Luhui586
enabled: false
url:
username:
password:
# 初始连接数
initialSize: 5
# 最小连接池数量
... ...
<configuration>
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>logs/output.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>logs/output.%d{yyyy-MM-dd}.log</fileNamePattern>
<maxHistory>5</maxHistory>
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<root level="info">
<appender-ref ref="FILE" />
<appender-ref ref="CONSOLE" />
</root>
</configuration>
\ No newline at end of file
... ...