From 3c45d4f9f3aba5bc85a9577e43c0dffc71b93a22 Mon Sep 17 00:00:00 2001 From: Junjie <fallin.jie@qq.com> Date: 星期四, 10 七月 2025 15:54:27 +0800 Subject: [PATCH] # --- src/main/java/com/zy/core/thread/impl/NyShuttleThread.java | 295 ++++++++++++++++++++++++++-------------------------------- 1 files changed, 133 insertions(+), 162 deletions(-) diff --git a/src/main/java/com/zy/core/thread/impl/NyShuttleThread.java b/src/main/java/com/zy/core/thread/impl/NyShuttleThread.java index c375106..68771e5 100644 --- a/src/main/java/com/zy/core/thread/impl/NyShuttleThread.java +++ b/src/main/java/com/zy/core/thread/impl/NyShuttleThread.java @@ -56,7 +56,7 @@ private static final boolean DEBUG = false;//璋冭瘯妯″紡 private List<JSONObject> socketReadResults = new ArrayList<>(); - private List<JSONObject> socketResults = new ArrayList<>(); + private List<DeviceMsgModel> socketResults = new ArrayList<>(); //鍘熷璁惧鏁版嵁 private Object originDeviceData; @@ -188,54 +188,32 @@ data.put("originDeviceData", deviceMsg.getDeviceOriginMsg()); socketReadResults.add(data); } else { - socketResults.add(data);//娣诲姞鏁版嵁 + socketResults.add(deviceMsg);//娣诲姞鏁版嵁 } } catch (Exception e) { e.printStackTrace(); } } - public JSONObject getRequestBody(String type, String taskId) { + public JSONObject getRequestBody(String resultKey) { try { // 鑾峰彇鏈嶅姟鍣ㄥ搷搴� JSONObject result = null; - if (type.equals("readState")) { - type = "state"; - } - + int idx = -1; for (int i = 0; i < socketResults.size(); i++) { - JSONObject socketResult = socketResults.get(i); - if (!socketResult.get("msgType").equals("responseMsg")) {//涓嶆槸鍝嶅簲鍐呭 - continue; - } - - JSONObject resultResponse = JSON.parseObject(socketResult.get("response").toString()); - JSONObject resultBody = JSON.parseObject(resultResponse.get("body").toString()); - String responseType = resultBody.get("responseType").toString(); - if (DEBUG) { - result = socketResult; + DeviceMsgModel deviceMsgModel = socketResults.get(i); + if(deviceMsgModel.getResultKey().equals(resultKey)){ + idx = i; + result = JSON.parseObject(JSON.toJSONString(deviceMsgModel.getDeviceMsg())); break; } - - if (!responseType.equals(type)) { - continue;//鍝嶅簲绫诲瀷涓庤姹傜被鍨嬩笉涓�鑷达紝涓嶅湪璋冭瘯妯″紡涓� - } - - if (taskId != null) { - String responseTaskId = resultBody.get("taskId").toString(); - if (!responseTaskId.equals(taskId)) { - continue;//鍝嶅簲ID涓庤姹侷D涓嶄竴鑷达紝涓嶅湪璋冭瘯妯″紡涓� - } - } - - result = socketResult; - break; } if (result == null) { return null;//鏃犲搷搴旂粨鏋� } + socketResults.remove(idx); return filterBodyData(result);//杩斿洖Body缁撴灉闆� } catch (Exception e) { return null; @@ -265,10 +243,10 @@ } NyShuttleHttpCommand readStatusCommand = getReadStatusCommand(deviceConfig.getDeviceNo()); - //鎸囦护瓒呰繃浜旀潯锛屼笉鍐嶄笅鍙戜换鍔$姸鎬佽姹� + //鎸囦护瓒呰繃2鏉★紝涓嶅啀涓嬪彂浠诲姟鐘舵�佽姹� TreeSet<String> deviceCommandMsgListKey = deviceMsgUtils.getDeviceCommandMsgListKey(SlaveType.Shuttle, deviceConfig.getDeviceNo()); - if (deviceCommandMsgListKey.size() < 5) { - requestCommandAsync(readStatusCommand);//璇锋眰鐘舵�� + if (deviceCommandMsgListKey.size() < 2) { + requestCommand(readStatusCommand);//璇锋眰鐘舵�� } if (this.socketReadResults.isEmpty()) { @@ -359,35 +337,38 @@ // 鑾峰彇鏈嶅姟鍣ㄥ搷搴� JSONObject result = null; int removeIdx = -1; + JSONObject socketResult = null; for (int i = 0; i < socketResults.size(); i++) { - JSONObject socketResult = socketResults.get(i); - if (socketResult == null) { + DeviceMsgModel deviceMsgModel = socketResults.get(i); + if (!deviceMsgModel.getDeviceMsgType().equals("shuttleInit")) { continue; } - if (!socketResult.get("msgType").equals("requestMsg")) {//涓嶆槸璇锋眰鍐呭 - continue; - } + removeIdx = i; + socketResult = JSON.parseObject(JSON.toJSONString(deviceMsgModel.getDeviceMsg())); + break; + } - JSONObject resultResponse = JSON.parseObject(socketResult.get("request").toString()); - JSONObject resultHeader = JSON.parseObject(resultResponse.get("header").toString()); - JSONObject resultBody = JSON.parseObject(resultResponse.get("body").toString()); - String requestType = resultBody.getString("requestType"); - Integer requestId = resultHeader.getInteger("requestId"); - if (requestType.equals("init")) { - removeIdx = i;//姝ゆ暟鎹凡缁忓鐞嗭紝浠庣粨鏋滈泦涓墧闄� - socketResults.remove(removeIdx); + if (socketResult == null) { + return; + } - Integer code = resultBody.getInteger("code"); - //灏忚溅澶嶄綅璇锋眰 - ShuttleCommand initCommand = getInitCommand(requestId, code); - //鍙戝嚭璇锋眰 - NyShuttleHttpCommand httpCommand = JSON.parseObject(initCommand.getBody(), NyShuttleHttpCommand.class); - JSONObject requestResult = requestCommand(httpCommand); + JSONObject resultResponse = JSON.parseObject(socketResult.get("request").toString()); + JSONObject resultHeader = JSON.parseObject(resultResponse.get("header").toString()); + JSONObject resultBody = JSON.parseObject(resultResponse.get("body").toString()); + String requestType = resultBody.getString("requestType"); + Integer requestId = resultHeader.getInteger("requestId"); + if (requestType.equals("init")) { + socketResults.remove(removeIdx); - log.info(MessageFormat.format("銆恵0}銆戝洓鍚戣溅澶嶄綅涓婃姤 ===>> [code:{1}] [ip:{2}] [port:{3}]", deviceConfig.getDeviceNo(), code, deviceConfig.getIp(), deviceConfig.getPort())); - OutputQueue.SHUTTLE.offer(MessageFormat.format("銆恵0}銆戝洓鍚戣溅澶嶄綅涓婃姤 ===>> [code:{1}] [ip:{2}] [port:{3}]", deviceConfig.getDeviceNo(), code, deviceConfig.getIp(), deviceConfig.getPort())); - break; - } + Integer code = resultBody.getInteger("code"); + //灏忚溅澶嶄綅璇锋眰 + ShuttleCommand initCommand = getInitCommand(requestId, code); + //鍙戝嚭璇锋眰 + NyShuttleHttpCommand httpCommand = JSON.parseObject(initCommand.getBody(), NyShuttleHttpCommand.class); + requestCommand(httpCommand); + + log.info(MessageFormat.format("銆恵0}銆戝洓鍚戣溅澶嶄綅涓婃姤 ===>> [code:{1}] [ip:{2}] [port:{3}]", deviceConfig.getDeviceNo(), code, deviceConfig.getIp(), deviceConfig.getPort())); + OutputQueue.SHUTTLE.offer(MessageFormat.format("銆恵0}銆戝洓鍚戣溅澶嶄綅涓婃姤 ===>> [code:{1}] [ip:{2}] [port:{3}]", deviceConfig.getDeviceNo(), code, deviceConfig.getIp(), deviceConfig.getPort())); } } catch (Exception e) { e.printStackTrace(); @@ -413,58 +394,81 @@ return response; } +// @Override +// public CommandResponse move(ShuttleCommand command) { +// CommandResponse response = new CommandResponse(false); +// try { +// //鍙戝嚭璇锋眰 +// NyShuttleHttpCommand httpCommand = JSON.parseObject(command.getBody(), NyShuttleHttpCommand.class); +// Map<String, Object> body = httpCommand.getRequest().getBody(); +// Object pathObj = body.get("path"); +// int taskId = Integer.parseInt(body.get("taskId").toString()); +// List<JSONObject> path = JSON.parseArray(JSON.toJSONString(pathObj), JSONObject.class); +// ArrayList<NyShuttleHttpCommand> commandList = new ArrayList<>(); +// while (!path.isEmpty()) { +// ArrayList<Map<String, Object>> list = new ArrayList<>(); +// if (path.size() > 10) { +// List<JSONObject> subList = path.subList(0, 10); +// list.addAll(subList); +// +// List<JSONObject> tmp = new ArrayList<>(); +// for (int i = 10; i < path.size(); i++) { +// tmp.add(path.get(i)); +// } +// path = tmp; +// }else { +// list.addAll(path); +// path.clear(); +// } +// +// NyShuttleHttpCommand httpCommandCopy = JSON.parseObject(JSON.toJSONString(httpCommand), NyShuttleHttpCommand.class); +// JSONObject bodyCopy = JSON.parseObject(JSON.toJSONString(body)); +// +// NyShuttleHttpCommand.NyRequest request = httpCommandCopy.getRequest(); +// bodyCopy.put("path", list); +// bodyCopy.put("taskId", taskId++); +// request.setBody(bodyCopy); +// httpCommandCopy.setRequest(request); +// +// commandList.add(httpCommandCopy);//add copy +// } +// +// for (NyShuttleHttpCommand requestCommand : commandList) { +// while (true) { +// JSONObject result = requestCommand(requestCommand); +// if (result == null) { +//// return response;//璇锋眰澶辫触 +// continue;//璇锋眰澶辫触灏濊瘯閲嶆柊璇锋眰 +// } +// this.shuttleProtocol.setSendTime(System.currentTimeMillis());//鎸囦护涓嬪彂鏃堕棿 +// response.setMessage(JSON.toJSONString(result)); +// response.setResult(true); +// break; +// } +// } +// return response; +// } catch (Exception e) { +// e.printStackTrace(); +// response.setMessage(e.getMessage()); +// return response; +// } +// } + @Override public CommandResponse move(ShuttleCommand command) { CommandResponse response = new CommandResponse(false); try { //鍙戝嚭璇锋眰 NyShuttleHttpCommand httpCommand = JSON.parseObject(command.getBody(), NyShuttleHttpCommand.class); - Map<String, Object> body = httpCommand.getRequest().getBody(); - Object pathObj = body.get("path"); - int taskId = Integer.parseInt(body.get("taskId").toString()); - List<JSONObject> path = JSON.parseArray(JSON.toJSONString(pathObj), JSONObject.class); - ArrayList<NyShuttleHttpCommand> commandList = new ArrayList<>(); - while (!path.isEmpty()) { - ArrayList<Map<String, Object>> list = new ArrayList<>(); - if (path.size() > 10) { - List<JSONObject> subList = path.subList(0, 10); - list.addAll(subList); - - List<JSONObject> tmp = new ArrayList<>(); - for (int i = 10; i < path.size(); i++) { - tmp.add(path.get(i)); - } - path = tmp; - }else { - list.addAll(path); - path.clear(); - } - - NyShuttleHttpCommand httpCommandCopy = JSON.parseObject(JSON.toJSONString(httpCommand), NyShuttleHttpCommand.class); - JSONObject bodyCopy = JSON.parseObject(JSON.toJSONString(body)); - - NyShuttleHttpCommand.NyRequest request = httpCommandCopy.getRequest(); - bodyCopy.put("path", list); - bodyCopy.put("taskId", taskId++); - request.setBody(bodyCopy); - httpCommandCopy.setRequest(request); - - commandList.add(httpCommandCopy);//add copy + String resultKey = requestCommand(httpCommand); + //鏌ヨ璇锋眰缁撴灉 + JSONObject result = queryCommandStatus(resultKey); + if (result == null) { + return response;//璇锋眰澶辫触 } - - for (NyShuttleHttpCommand requestCommand : commandList) { - while (true) { - JSONObject result = requestCommand(requestCommand); - if (result == null) { -// return response;//璇锋眰澶辫触 - continue;//璇锋眰澶辫触灏濊瘯閲嶆柊璇锋眰 - } - this.shuttleProtocol.setSendTime(System.currentTimeMillis());//鎸囦护涓嬪彂鏃堕棿 - response.setMessage(JSON.toJSONString(result)); - response.setResult(true); - break; - } - } + this.shuttleProtocol.setSendTime(System.currentTimeMillis());//鎸囦护涓嬪彂鏃堕棿 + response.setMessage(JSON.toJSONString(result)); + response.setResult(true); return response; } catch (Exception e) { e.printStackTrace(); @@ -479,7 +483,9 @@ try { //鍙戝嚭璇锋眰 NyShuttleHttpCommand httpCommand = JSON.parseObject(command.getBody(), NyShuttleHttpCommand.class); - JSONObject result = requestCommand(httpCommand); + String resultKey = requestCommand(httpCommand); + //鏌ヨ璇锋眰缁撴灉 + JSONObject result = queryCommandStatus(resultKey); if (result == null) { return response;//璇锋眰澶辫触 } @@ -499,7 +505,9 @@ try { //鍙戝嚭璇锋眰 NyShuttleHttpCommand httpCommand = JSON.parseObject(command.getBody(), NyShuttleHttpCommand.class); - JSONObject result = requestCommand(httpCommand); + String resultKey = requestCommand(httpCommand); + //鏌ヨ璇锋眰缁撴灉 + JSONObject result = queryCommandStatus(resultKey); if (result == null) { return response;//璇锋眰澶辫触 } @@ -527,7 +535,9 @@ try { //鍙戝嚭璇锋眰 NyShuttleHttpCommand httpCommand = JSON.parseObject(command.getBody(), NyShuttleHttpCommand.class); - JSONObject result = requestCommand(httpCommand); + String resultKey = requestCommand(httpCommand); + //鏌ヨ璇锋眰缁撴灉 + JSONObject result = queryCommandStatus(resultKey); if (result == null) { return response;//璇锋眰澶辫触 } @@ -1097,8 +1107,8 @@ return httpStandard; } - //鍙戝嚭璇锋眰-鍚屾 - private JSONObject requestCommand(NyShuttleHttpCommand httpCommand) throws IOException { + //鍙戝嚭璇锋眰 + private String requestCommand(NyShuttleHttpCommand httpCommand) throws IOException { try { DeviceMsgUtils deviceMsgUtils = SpringUtils.getBean(DeviceMsgUtils.class); if (deviceMsgUtils == null) { @@ -1114,69 +1124,30 @@ commandMsgModel.setDeviceType(String.valueOf(SlaveType.Shuttle)); commandMsgModel.setCommand(data); String key = deviceMsgUtils.sendDeviceCommand(SlaveType.Shuttle, deviceConfig.getDeviceNo(), commandMsgModel); - - String requestType = null; - String taskId = null; - try { - requestType = httpCommand.getRequest().getBody().get("requestType").toString(); - taskId = httpCommand.getRequest().getBody().get("taskId").toString(); - } catch (Exception e) { -// return null; - //taskId鍙兘鍙栫┖锛屼笉鎶ラ敊锛屾甯告儏鍐� - } - - // 鑾峰彇鏈嶅姟鍣ㄥ搷搴� - // 灏濊瘯30娆� - JSONObject result = null; - for (int i = 0; i < 30; i++) { - result = getRequestBody(requestType, taskId); - if (result == null) { - try { - Thread.sleep(100); - } catch (Exception e) { - e.printStackTrace(); - } - }else { - break; - } - } - return result;//杩斿洖Body缁撴灉闆� + return key; }catch (Exception e) { e.printStackTrace(); } return null; } - //鍙戝嚭璇锋眰-绉绘 - private void requestCommandAsync(NyShuttleHttpCommand httpCommand) throws IOException { - try { - DeviceMsgUtils deviceMsgUtils = SpringUtils.getBean(DeviceMsgUtils.class); - if (deviceMsgUtils == null) { - return; + private JSONObject queryCommandStatus(String resultKey) { + // 鑾峰彇鏈嶅姟鍣ㄥ搷搴� + // 灏濊瘯50娆� + JSONObject result = null; + for (int i = 0; i < 50; i++) { + result = getRequestBody(resultKey); + if (result == null) { + try { + Thread.sleep(500); + } catch (Exception e) { + e.printStackTrace(); + } + }else { + break; } - - //鍘嬬缉鏁版嵁鍖� - JSONObject data = JSON.parseObject(JSON.toJSONString(httpCommand)); - data.remove("nodes"); - - DeviceCommandMsgModel commandMsgModel = new DeviceCommandMsgModel(); - commandMsgModel.setDeviceId(deviceConfig.getDeviceNo()); - commandMsgModel.setDeviceType(String.valueOf(SlaveType.Shuttle)); - commandMsgModel.setCommand(data); - String key = deviceMsgUtils.sendDeviceCommand(SlaveType.Shuttle, deviceConfig.getDeviceNo(), commandMsgModel); - - String requestType = null; - String taskId = null; - try { - requestType = httpCommand.getRequest().getBody().get("requestType").toString(); - taskId = httpCommand.getRequest().getBody().get("taskId").toString(); - } catch (Exception e) { -// return null; - //taskId鍙兘鍙栫┖锛屼笉鎶ラ敊锛屾甯告儏鍐� - } - }catch (Exception e) { - e.printStackTrace(); } + return result; } private JSONObject filterBodyData(JSONObject data) { -- Gitblit v1.9.1