1、优化推送重发记录

This commit is contained in:
weidong 2024-02-07 14:20:36 +08:00
parent bfcfdb8249
commit 7e58f92ae3
5 changed files with 53 additions and 33 deletions

View File

@ -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;
}

View File

@ -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){
}
}
}

View File

@ -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);
}

View File

@ -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;
/***

View File

@ -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>