From f70ef350963c4a6a6788e9ee75661b08feec1453 Mon Sep 17 00:00:00 2001 From: weidong Date: Tue, 23 Jan 2024 09:47:22 +0800 Subject: [PATCH] =?UTF-8?q?1=E3=80=81=E4=BC=98=E5=8C=96=E9=87=91=E9=A9=AC?= =?UTF-8?q?=E5=B9=B3=E5=8F=B0=E6=8E=A8=E9=80=81=E6=98=AF=E5=90=A6=E6=88=90?= =?UTF-8?q?=E5=8A=9F=E7=9A=84=E5=88=A4=E6=96=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/imdroid/secapi/dto/FwdRecord.java | 1 + .../imdroid/beidou_fwd/service/TCPClient.java | 17 +++++-- .../beidou_fwd/service/TCPListener.java | 7 +++ .../beidou_fwd/service/TcpMessageHandler.java | 3 +- .../imdroid/beidou_fwd/task/Forwarder.java | 45 ++++++++++++++----- .../beidou_fwd/task/GXXfzForwarder.java | 21 ++++++++- .../beidou_fwd/task/KingMaForwarder.java | 27 ++++++----- .../resources/templates/page/fwd_records.html | 2 + 8 files changed, 94 insertions(+), 29 deletions(-) create mode 100644 sec-beidou-fwd/src/main/java/com/imdroid/beidou_fwd/service/TCPListener.java diff --git a/sec-api/src/main/java/com/imdroid/secapi/dto/FwdRecord.java b/sec-api/src/main/java/com/imdroid/secapi/dto/FwdRecord.java index 14bba0f6..f0eabc31 100644 --- a/sec-api/src/main/java/com/imdroid/secapi/dto/FwdRecord.java +++ b/sec-api/src/main/java/com/imdroid/secapi/dto/FwdRecord.java @@ -19,6 +19,7 @@ public class FwdRecord { public static final short STATE_UPLOADING = 2; public static final short STATE_UPLOAD_DONE = 3; public static final short STATE_FWD_DONE = 0; + public static final short STATE_FWD_FAILED = -1; @TableId(value = "id", type = IdType.AUTO) Long id; Integer tenantid; diff --git a/sec-beidou-fwd/src/main/java/com/imdroid/beidou_fwd/service/TCPClient.java b/sec-beidou-fwd/src/main/java/com/imdroid/beidou_fwd/service/TCPClient.java index 3ff2138d..ab30ac75 100644 --- a/sec-beidou-fwd/src/main/java/com/imdroid/beidou_fwd/service/TCPClient.java +++ b/sec-beidou-fwd/src/main/java/com/imdroid/beidou_fwd/service/TCPClient.java @@ -26,14 +26,16 @@ public class TCPClient { private EventLoopGroup group; private Channel channel; ByteBuf sendBuffer; + TCPListener listener; public void start() { new Thread(this::connect, "xfz-tcp-client").start(); } - public void init(String dest_addr, int dest_port) { - host = dest_addr; - port = dest_port; + public void init(String dest_addr, int dest_port, TCPListener listener) { + this.host = dest_addr; + this.port = dest_port; + this.listener = listener; //客户端需要一个事件循环组 group = new NioEventLoopGroup(); @@ -89,18 +91,25 @@ public class TCPClient { else connect(); } - public void onConnectionActive(){ + public void onConnected(){ + listener.onConnected(); flush(); } + public void onDisconnect(){ + listener.onDisconnect(); + } + private void flush(){ if(sendBuffer!=null && sendBuffer.readableBytes()>0){ channel.writeAndFlush(sendBuffer).addListener(future -> { if (future.isSuccess()) { logger.info("send to xfz server succeed."); //sendBuffer.release(); // writeAndFlush后就释放了 + listener.onSendResult(true); } else { logger.info("send to xfz server failed."); + listener.onSendResult(false); } }); } diff --git a/sec-beidou-fwd/src/main/java/com/imdroid/beidou_fwd/service/TCPListener.java b/sec-beidou-fwd/src/main/java/com/imdroid/beidou_fwd/service/TCPListener.java new file mode 100644 index 00000000..4b17a4d5 --- /dev/null +++ b/sec-beidou-fwd/src/main/java/com/imdroid/beidou_fwd/service/TCPListener.java @@ -0,0 +1,7 @@ +package com.imdroid.beidou_fwd.service; + +public interface TCPListener { + void onConnected(); + void onDisconnect(); + void onSendResult(boolean isOK); +} diff --git a/sec-beidou-fwd/src/main/java/com/imdroid/beidou_fwd/service/TcpMessageHandler.java b/sec-beidou-fwd/src/main/java/com/imdroid/beidou_fwd/service/TcpMessageHandler.java index 986c1505..549ffc17 100644 --- a/sec-beidou-fwd/src/main/java/com/imdroid/beidou_fwd/service/TcpMessageHandler.java +++ b/sec-beidou-fwd/src/main/java/com/imdroid/beidou_fwd/service/TcpMessageHandler.java @@ -33,12 +33,13 @@ public class TcpMessageHandler extends SimpleChannelInboundHandler { @Override public void channelActive(ChannelHandlerContext ctx) throws Exception { logger.info("xfz tcp channel active"); - tcpClient.onConnectionActive(); + tcpClient.onConnected(); } @Override public void channelInactive(ChannelHandlerContext ctx) throws Exception { logger.info("xfz tcp channel inactive"); + tcpClient.onDisconnect(); } @Override diff --git a/sec-beidou-fwd/src/main/java/com/imdroid/beidou_fwd/task/Forwarder.java b/sec-beidou-fwd/src/main/java/com/imdroid/beidou_fwd/task/Forwarder.java index 2b5d64ee..e0c709bf 100644 --- a/sec-beidou-fwd/src/main/java/com/imdroid/beidou_fwd/task/Forwarder.java +++ b/sec-beidou-fwd/src/main/java/com/imdroid/beidou_fwd/task/Forwarder.java @@ -100,26 +100,37 @@ public class Forwarder { // 按项目打包推送 int totalSendNum = 0; + boolean fwdFailed = false; for (Map.Entry> entry: projects.entrySet()){ - int sendNum = send(entry.getKey(), entry.getValue()); + String projectId = entry.getKey(); + List records = entry.getValue(); + if(records.size() == 0) continue; + + int sendNum = send(projectId, records); + + FwdRecord fwdRecord = new FwdRecord(); + fwdRecord.setProject_id(projectId); + fwdRecord.setTenantid(tenantId); + fwdRecord.setDevicenum((short) records.size()); + fwdRecord.setStarttime(nowTime); + fwdRecord.setEndtime(nowTime); + fwdRecord.setFwd_group_id(fwdGroupId); if(sendNum > 0) { totalSendNum += sendNum; // 记录推送 - FwdRecord fwdRecord = new FwdRecord(); - fwdRecord.setProject_id(entry.getKey()); - fwdRecord.setTenantid(tenantId); - fwdRecord.setDevicenum((short) entry.getValue().size()); - fwdRecord.setStarttime(nowTime); - fwdRecord.setEndtime(nowTime); fwdRecord.setState(FwdRecord.STATE_FWD_DONE); - fwdRecord.setFwd_group_id(fwdGroupId); - fwdRecordsMapper.insert(fwdRecord); } + else{ + fwdRecord.setState(FwdRecord.STATE_FWD_FAILED); + fwdFailed = true; + } + fwdRecordsMapper.insert(fwdRecord); } // 更新推送信息 if(totalSendNum>0) updateFwd(totalSendNum, true); + else if(fwdFailed) updateFwd(totalSendNum, false); } @@ -130,6 +141,8 @@ public class Forwarder { queryWrapper.eq("state",FwdRecord.STATE_UPLOAD_DONE); List fwdRecordsList = fwdRecordsMapper.selectList(queryWrapper); // 2.检索这个这个时间段的解算结果,如果有数据则单个终端转发,标志记录为已补传 + int totalSendNum = 0; + boolean fwdFailed = false; for(FwdRecord fwdRecord:fwdRecordsList){ // 查找device QueryWrapper deviceQueryWrapper = new QueryWrapper<>(); @@ -148,12 +161,22 @@ public class Forwarder { calcDataQueryWrapper.isNotNull("rb562e"); List calcDataList = gnssDataMapper.selectList(calcDataQueryWrapper); // 推送记录 - if(sendBatch(device, fwdRecord.getProject_id(), calcDataList)>0) { + int sendNum = sendBatch(device, fwdRecord.getProject_id(), calcDataList); + if(sendNum > 0) { // 记录推送结果 fwdRecord.setState(FwdRecord.STATE_FWD_DONE); - fwdRecordsMapper.updateById(fwdRecord); + totalSendNum += sendNum; } + else{ + fwdRecord.setState(FwdRecord.STATE_FWD_FAILED); + fwdFailed = true; + } + fwdRecordsMapper.updateById(fwdRecord); } + + // 更新推送信息 + if(totalSendNum>0) updateFwd(totalSendNum, true); + else if(fwdFailed) updateFwd(totalSendNum, false); } int sendBatch(GnssDevice device, String projectId, List records){ diff --git a/sec-beidou-fwd/src/main/java/com/imdroid/beidou_fwd/task/GXXfzForwarder.java b/sec-beidou-fwd/src/main/java/com/imdroid/beidou_fwd/task/GXXfzForwarder.java index ffebdc59..10b4e5a6 100644 --- a/sec-beidou-fwd/src/main/java/com/imdroid/beidou_fwd/task/GXXfzForwarder.java +++ b/sec-beidou-fwd/src/main/java/com/imdroid/beidou_fwd/task/GXXfzForwarder.java @@ -2,6 +2,7 @@ package com.imdroid.beidou_fwd.task; import com.imdroid.beidou_fwd.entity.XFZData; import com.imdroid.beidou_fwd.service.TCPClient; +import com.imdroid.beidou_fwd.service.TCPListener; import com.imdroid.common.util.GsonUtil; import com.imdroid.common.util.NumberUtils; import com.imdroid.secapi.dto.*; @@ -35,11 +36,29 @@ public class GXXfzForwarder extends Forwarder{ final DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + static class GXXfzTCPListener implements TCPListener{ + + @Override + public void onConnected() { + + } + + @Override + public void onDisconnect() { + + } + + @Override + public void onSendResult(boolean isOK) { + + } + } + @PostConstruct void registerMe(){ init(FORWARDER_NAME, "TCP "+host+":"+port,1,false); xfzTcpClient = new TCPClient(); - xfzTcpClient.init(host, port); + xfzTcpClient.init(host, port, new GXXfzTCPListener()); xfzTcpClient.start(); } diff --git a/sec-beidou-fwd/src/main/java/com/imdroid/beidou_fwd/task/KingMaForwarder.java b/sec-beidou-fwd/src/main/java/com/imdroid/beidou_fwd/task/KingMaForwarder.java index 9886c466..1b983379 100644 --- a/sec-beidou-fwd/src/main/java/com/imdroid/beidou_fwd/task/KingMaForwarder.java +++ b/sec-beidou-fwd/src/main/java/com/imdroid/beidou_fwd/task/KingMaForwarder.java @@ -59,21 +59,16 @@ public class KingMaForwarder extends Forwarder{ forwardHistoryGnss(FORWARDER_NAME); } - boolean updateToken(){ + boolean updateToken() throws Exception{ String jsonLogin = "{\"username\":\""+login_user+"\"," + "\"password\":\""+login_pwd+"\"}"; String result = HttpUtils.postJson(login_host, jsonLogin); if(result == null) return false; String token = null; - try { - JSONObject obj = (JSONObject) JSONObject.parse(result); - obj = obj.getJSONObject("data"); - token = obj.getString("token"); - } - catch (Exception e){ - - } + JSONObject obj = (JSONObject) JSONObject.parse(result); + obj = obj.getJSONObject("data"); + token = obj.getString("token"); if(token == null) return false; if(header == null){ @@ -86,12 +81,17 @@ public class KingMaForwarder extends Forwarder{ @Override int send(String projectId, List records){ int sendNum = 0; - if(records.size() == 0) return 0; // 检查token是否过期 LocalDateTime nowTime = LocalDateTime.now(); if(header == null || nowTime.isAfter(lastTokenTime.plusMinutes(59))){ - if(!updateToken()){ + try { + if (!updateToken()) { + logger.info("update token failed!"); + return 0; + } + } + catch (Exception e){ logger.info("update token failed!"); return 0; } @@ -115,7 +115,10 @@ public class KingMaForwarder extends Forwarder{ logger.info("project " + projectId + ": push calculation result to Kingma"); logger.info(json); logger.info("result: "+result); - return sendNum; + JSONObject obj = (JSONObject) JSONObject.parse(result); + String msg = obj.getString("message"); + if(msg.equals("Success")) return sendNum; + else return 0; } } diff --git a/sec-beidou/src/main/resources/templates/page/fwd_records.html b/sec-beidou/src/main/resources/templates/page/fwd_records.html index cb0410fd..b0d03ea9 100644 --- a/sec-beidou/src/main/resources/templates/page/fwd_records.html +++ b/sec-beidou/src/main/resources/templates/page/fwd_records.html @@ -55,6 +55,8 @@ 补传中 {{# } else if(d.state == 3){ }} 补传完成 + {{# } else if(d.state == -1){ }} + 推送失败 {{# } else { }} 等待 {{# } }}