1、优化推送重发记录
This commit is contained in:
parent
bfcfdb8249
commit
7e58f92ae3
@ -15,6 +15,9 @@ import java.time.LocalDateTime;
|
||||
@Data
|
||||
@TableName(value = "resendrecords")
|
||||
public class ResendRecord {
|
||||
static public final short STATE_FWD_OK = 0;
|
||||
static public final short STATE_FWD_FAILED = 1;
|
||||
static public final short STATE_BREAK_POINT = 2;
|
||||
@TableId(value = "id", type = IdType.AUTO)
|
||||
Long id;
|
||||
Integer tenantid;
|
||||
@ -24,5 +27,6 @@ public class ResendRecord {
|
||||
LocalDateTime starttime;
|
||||
LocalDateTime endtime;
|
||||
String fwd_group_id;
|
||||
Short state;
|
||||
|
||||
}
|
||||
|
||||
@ -79,18 +79,18 @@ public class Forwarder {
|
||||
* @param sendTime:要推送的记录的时间
|
||||
* @param deviceId:设备ID,如果没有指定,则推送全部
|
||||
*/
|
||||
boolean forwardGnssRecords(LocalDateTime sendTime, String deviceId) {
|
||||
private boolean forwardGnssRecords(LocalDateTime sendTime, String deviceId, ResendRecord resendRecord) {
|
||||
String endTime = sendTime.format(formatter);
|
||||
String beginTime = sendTime.minusMinutes(fwdCycleMinutes).format(formatter);
|
||||
|
||||
// 查找属于指定推送组的设备列表
|
||||
QueryWrapper<GnssDevice> queryWrapper = new QueryWrapper<>();
|
||||
queryWrapper.eq("fwd_group_id", fwdGroupId)
|
||||
.or()
|
||||
.eq("fwd_group_id2", fwdGroupId);
|
||||
if(deviceId != null){
|
||||
queryWrapper.eq("deviceid", deviceId);
|
||||
}
|
||||
queryWrapper.eq("fwd_group_id", fwdGroupId)
|
||||
.or()
|
||||
.eq("fwd_group_id2", fwdGroupId);
|
||||
List<GnssDevice> gnssDeviceList = deviceMapper.selectList(queryWrapper);
|
||||
|
||||
// 查询最近半小时的GNSS记录
|
||||
@ -104,6 +104,7 @@ public class Forwarder {
|
||||
gnssQueryWrapper.eq("deviceid", deviceId);
|
||||
}
|
||||
List<GnssCalcData> locationRecords = gnssDataMapper.selectList(gnssQueryWrapper);
|
||||
if(locationRecords.size() == 0) return false;
|
||||
|
||||
// 构造按项目id分类的GNSS记录
|
||||
ConcurrentHashMap<String, List<GnssCalcData>> projects = new ConcurrentHashMap<>();
|
||||
@ -164,20 +165,31 @@ public class Forwarder {
|
||||
if(sendNum > 0) {
|
||||
totalSendNum += sendNum;
|
||||
fwdRecord.setResult(FwdRecord.RESULT_OK);
|
||||
if(resendRecord != null){
|
||||
resendRecord.setState(ResendRecord.STATE_FWD_OK);
|
||||
resendRecordMapper.updateById(resendRecord);
|
||||
}
|
||||
}
|
||||
else{
|
||||
fwdResult = false;
|
||||
fwdRecord.setResult(FwdRecord.RESULT_FAILED);
|
||||
// 新增重发记录
|
||||
ResendRecord resendRecord = new ResendRecord();
|
||||
if(resendRecord == null) {
|
||||
resendRecord = new ResendRecord();
|
||||
resendRecord.setProjectid(projectId);
|
||||
resendRecord.setTenantid(tenantId);
|
||||
resendRecord.setCreatetime(LocalDateTime.now());
|
||||
resendRecord.setStarttime(sendTime);
|
||||
resendRecord.setEndtime(sendTime.plusMinutes(10));
|
||||
resendRecord.setEndtime(sendTime);
|
||||
resendRecord.setFwd_group_id(fwdGroupId);
|
||||
resendRecord.setState(ResendRecord.STATE_FWD_FAILED);
|
||||
resendRecordMapper.insert(resendRecord);
|
||||
}
|
||||
else{
|
||||
resendRecord.setState(ResendRecord.STATE_FWD_FAILED);
|
||||
resendRecordMapper.updateById(resendRecord);
|
||||
}
|
||||
}
|
||||
fwdRecordsMapper.insert(fwdRecord);
|
||||
}
|
||||
|
||||
@ -189,11 +201,11 @@ public class Forwarder {
|
||||
}
|
||||
|
||||
void forwardCurrentGnss() {
|
||||
if(forwardGnssRecords(LocalDateTime.now(),null)) {
|
||||
if(forwardGnssRecords(LocalDateTime.now(),null,null)) {
|
||||
// 推送失败记录、补发记录
|
||||
ThreadManager.getScheduledThreadPool().schedule(() -> {
|
||||
forwardHistoryGnss();
|
||||
},300, TimeUnit.SECONDS);
|
||||
this.forwardHistoryGnss();
|
||||
},100, TimeUnit.SECONDS);
|
||||
}
|
||||
}
|
||||
|
||||
@ -201,28 +213,19 @@ public class Forwarder {
|
||||
// 1.从转发记录表里检索待补传记录时间表,含设备Id,时间段
|
||||
QueryWrapper<ResendRecord> queryWrapper = new QueryWrapper<>();
|
||||
queryWrapper.eq("fwd_group_id",fwdGroupId);
|
||||
queryWrapper.ne("state",ResendRecord.STATE_FWD_OK);
|
||||
List<ResendRecord> resendRecordsList = resendRecordMapper.selectList(queryWrapper);
|
||||
// 2.检索这个这个时间段的解算结果,如果有数据则单个终端转发,标志记录为已补传
|
||||
List<Long> ids = new ArrayList<>();
|
||||
for(ResendRecord record:resendRecordsList){
|
||||
ids.add(record.getId());
|
||||
forwardBatchGnssRecords(
|
||||
record.getStarttime(), record.getEndtime(), record.getDeviceid());
|
||||
forwardBatchGnssRecords(record);
|
||||
}
|
||||
resendRecordMapper.deleteBatchIds(ids);
|
||||
}
|
||||
|
||||
void forwardBatchGnssRecords(LocalDateTime beginTime, LocalDateTime endTime, String deviceId) {
|
||||
LocalDateTime sendTime = beginTime;
|
||||
while(sendTime.isBefore(endTime)){
|
||||
forwardGnssRecords(sendTime,deviceId);
|
||||
void forwardBatchGnssRecords(ResendRecord record) {
|
||||
LocalDateTime sendTime = record.getStarttime();
|
||||
while(sendTime.isBefore(record.getEndtime()) || sendTime.isEqual(record.getEndtime())){
|
||||
forwardGnssRecords(sendTime,record.getDeviceid(),record);
|
||||
sendTime = sendTime.plusMinutes(fwdCycleMinutes);
|
||||
try {
|
||||
Thread.sleep(500);
|
||||
}
|
||||
catch (Exception e){
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -101,6 +101,7 @@ public class MultiLineGNSSCalcService {
|
||||
ResendRecord fwdRecord = fwdRecordMap.get(deviceId);
|
||||
if(fwdRecord != null){
|
||||
fwdRecord.setEndtime(lastDate);
|
||||
fwdRecord.setState(ResendRecord.STATE_BREAK_POINT);
|
||||
resendRecordMapper.insert(fwdRecord);
|
||||
fwdRecordMap.remove(deviceId);
|
||||
}
|
||||
|
||||
@ -266,6 +266,7 @@ CREATE TABLE IF NOT EXISTS `resendrecords` (
|
||||
`starttime` datetime DEFAULT NULL,
|
||||
`endtime` datetime DEFAULT NULL,
|
||||
`fwd_group_id` varchar(64) DEFAULT NULL,
|
||||
`state` smallint DEFAULT NULL,
|
||||
PRIMARY KEY (`id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
|
||||
/***
|
||||
|
||||
@ -91,9 +91,10 @@
|
||||
{field: 'project_id', title: '项目号', sort: true},
|
||||
{field: 'deviceid', title: '设备号'},
|
||||
{field: 'createtime', title: '推送时间', templet: "<div>{{layui.util.toDateString(d.createtime, 'yyyy-MM-dd HH:mm:ss')}}</div>"},
|
||||
{field: 'starttime', title: '开始时间', templet: "<div>{{layui.util.toDateString(d.starttime, 'yyyy-MM-dd HH:mm:ss')}}</div>"},
|
||||
{field: 'endtime', title: '结束时间', templet: "<div>{{layui.util.toDateString(d.endtime, 'yyyy-MM-dd HH:mm:ss')}}</div>"},
|
||||
{field: 'fwd_group_id', title: '推送组'}
|
||||
{field: 'starttime', title: '数据开始时间', templet: "<div>{{layui.util.toDateString(d.starttime, 'yyyy-MM-dd HH:mm:ss')}}</div>"},
|
||||
{field: 'endtime', title: '数据结束时间', templet: "<div>{{layui.util.toDateString(d.endtime, 'yyyy-MM-dd HH:mm:ss')}}</div>"},
|
||||
{field: 'fwd_group_id', title: '推送组'},
|
||||
{field: 'state', title: '状态',templet: '#stateTrans'}
|
||||
]],
|
||||
limit: 10,
|
||||
page: true,
|
||||
@ -121,5 +122,15 @@
|
||||
|
||||
</script>
|
||||
|
||||
<script type="text/html" id="stateTrans">
|
||||
{{# if(d.state == 0){ }}
|
||||
<span class="layui-badge layui-bg-green">推送成功</span>
|
||||
{{# } else if(d.state == 1){ }}
|
||||
<span class="layui-badge layui-bg-red">推送失败</span>
|
||||
{{# } else { }}
|
||||
<span class="layui-badge layui-bg-orange">断点补传</span>
|
||||
{{# } }}
|
||||
</script>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
Loading…
x
Reference in New Issue
Block a user