From 1065c305d259e5af4408727b68a8ca78ffb885b0 Mon Sep 17 00:00:00 2001 From: "jieying.li" Date: Mon, 2 Dec 2024 03:09:06 +0800 Subject: [PATCH] =?UTF-8?q?fix:=E6=89=A7=E8=A1=8C=E5=BC=95=E6=93=8E=201.?= =?UTF-8?q?=E5=89=8D=E7=AB=AF=E5=BD=93=E5=89=8D=E6=AD=A5=E9=AA=A4=E6=A0=87?= =?UTF-8?q?=E8=AF=86=E4=B8=A2=E5=A4=B1=EF=BC=8C=E5=A4=A7=E6=A6=82=E5=8E=9F?= =?UTF-8?q?=E5=9B=A0=E6=98=AF=E5=9C=A8=E7=9F=AD=E6=97=B6=E9=97=B4=E5=90=8E?= =?UTF-8?q?=E6=8E=A5=E6=94=B6=E5=88=B0=E5=A4=9A=E4=B8=AA=E5=9B=9E=E6=94=BE?= =?UTF-8?q?=E6=8C=87=E4=BB=A4replay=5Fstart=EF=BC=8C=E5=89=8D=E7=AB=AF?= =?UTF-8?q?=E5=8F=AA=E8=AE=B0=E5=BD=95=E6=9C=80=E5=90=8E=E7=9A=84requestId?= =?UTF-8?q?=E4=BD=9C=E4=B8=BA=E6=A0=87=E8=AF=86=EF=BC=8C=E8=80=8C=E5=BC=95?= =?UTF-8?q?=E6=93=8E=E6=8E=A5=E5=8F=97=E5=88=B0=E5=A4=9A=E6=AC=A1replay=5F?= =?UTF-8?q?start=E9=9C=80=E8=A6=81=E6=8C=89=E9=A1=BA=E5=BA=8F=E5=A4=84?= =?UTF-8?q?=E7=90=86=E5=A4=9A=E4=B8=AA=E5=9B=9E=E6=94=BE=E3=80=82=20?= =?UTF-8?q?=E5=BC=95=E6=93=8E=E5=9C=A8=E5=93=8D=E5=BA=94=E6=9C=80=E5=85=88?= =?UTF-8?q?=E6=8E=A5=E5=8F=97=E5=88=B0=E5=9B=9E=E6=94=BE=E6=8C=87=E4=BB=A4?= =?UTF-8?q?=E4=B8=ADrequestId=E4=B8=8E=E5=89=8D=E7=AB=AF=E4=B8=8D=E4=B8=80?= =?UTF-8?q?=E8=87=B4=EF=BC=8C=E9=82=A3=E4=B9=88=E5=89=8D=E7=AB=AF=E6=97=A0?= =?UTF-8?q?=E6=B3=95=E6=98=BE=E7=A4=BA=E6=AD=A5=E9=AA=A4=E6=89=80=E6=9C=89?= =?UTF-8?q?=E8=BF=94=E5=9B=9E=E6=9D=A5=E7=9A=84rely=E6=8C=87=E4=BB=A4?= =?UTF-8?q?=E3=80=82=20=E6=8C=89=E7=85=A7=E8=BF=99=E6=A0=B7=E7=9A=84?= =?UTF-8?q?=E9=80=BB=E8=BE=91=EF=BC=8C=E5=A6=82=E6=9E=9C=E7=9F=AD=E6=97=B6?= =?UTF-8?q?=E9=97=B4=E5=86=85=E6=8E=A5=E6=94=B6=E5=88=B0=E5=A4=9A=E4=B8=AA?= =?UTF-8?q?replay=5Fstart=E5=9B=9E=E6=94=BE=E6=8C=87=E4=BB=A4=EF=BC=8C?= =?UTF-8?q?=E4=BD=BF=E7=94=A8=E6=9C=80=E5=90=8E=E7=9A=84requestId=E6=9B=B4?= =?UTF-8?q?=E6=96=B0=E5=88=B0=E6=AD=A3=E5=9C=A8=E5=9B=9E=E6=94=BE=E7=9A=84?= =?UTF-8?q?requestId=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cctp/se/debug/service/DebugSession.java | 23 ++++++ .../se/debug/service/DefaultDebugSession.java | 76 ++++++++++++++++++- .../debug/service/impl/DebugServiceImpl.java | 15 ++++ .../cctp/se/script/core/ScriptExecutor.java | 5 ++ .../script/service/ScriptRuntimeExecutor.java | 13 ++++ 5 files changed, 130 insertions(+), 2 deletions(-) diff --git a/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/debug/service/DebugSession.java b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/debug/service/DebugSession.java index f5b66f8..7187613 100644 --- a/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/debug/service/DebugSession.java +++ b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/debug/service/DebugSession.java @@ -30,6 +30,29 @@ public interface DebugSession extends Runnable { */ String getDeviceId(); + /** + * 是否正在回放 + * @return + */ + boolean isReplay(); + + /** + * 获取requestId + * @return + */ + String getRequestId(); + + /** + * 设置requestId + * @param requestId + */ + void setRequestId(String requestId); + + /** + * 更新执行器requestId + */ + void updateRequestId(); + /** * 处理请求指令 * @param request diff --git a/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/debug/service/DefaultDebugSession.java b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/debug/service/DefaultDebugSession.java index 044820a..16a2667 100644 --- a/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/debug/service/DefaultDebugSession.java +++ b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/debug/service/DefaultDebugSession.java @@ -41,7 +41,10 @@ public class DefaultDebugSession implements DebugSession { private String deviceId; private DeviceConnection deviceConnection; + private String requestId; + private boolean running = true; + private boolean replaying = false; private Thread thread; @@ -79,6 +82,9 @@ public class DefaultDebugSession implements DebugSession { if (childResult != null) { result.setChildResult(null); // 调试过程中子步骤的结果对于前端没有意义 } + if (requestId != null && !requestId.equalsIgnoreCase(result.getRequestId())) { // 请求标识requestId被修改了,使用新的 + result.setRequestId(requestId); + } HashMap replyMap = new HashMap<>(); replyMap.put("cmd", DebugerConst.ReplyConst.KEY_CMD_REPLY); replyMap.put(DebugerConst.KEY_SESSIONID, sessionId); @@ -96,6 +102,13 @@ public class DefaultDebugSession implements DebugSession { HashMap replyMap = new HashMap<>(); replyMap.put("cmd", cmd); replyMap.put(DebugerConst.KEY_SESSIONID, sessionId); + + if (obj instanceof Map) { + Object mapRequestId = ((Map) obj).get(DebugerConst.KEY_REQUESTID); + if (requestId != null && !requestId.equalsIgnoreCase((String)mapRequestId)) { // 请求标识requestId被修改了,使用新的 + ((Map) obj).put(DebugerConst.KEY_REQUESTID, requestId); + } + } replyMap.put(DebugerConst.ReplyConst.KEY_REPLY_DATA, obj); sendText(JsonUtils.toJson(replyMap)); } @@ -159,6 +172,48 @@ public class DefaultDebugSession implements DebugSession { return this.deviceId; } + /** + * 是否正在回放 + * + * @return + */ + @Override + public boolean isReplay() { + return this.replaying; + } + + /** + * 获取requestId + * + * @return + */ + @Override + public String getRequestId() { + return this.requestId; + } + + /** + * 设置requestId + * + * @param requestId + */ + @Override + public void setRequestId(String requestId) { + this.requestId = requestId; + } + + /** + * 更新执行器requestId + */ + @Override + public void updateRequestId() { + ScriptExecutor scriptExecutor = SpringUtils.getBean(ScriptResolutionService.class).getScriptExecutor(sessionId); + if (scriptExecutor != null) { + scriptExecutor.setRequestId(this.requestId); + scriptExecutor.updateRequestId(); + } + } + @Override public void processRequest(DebuggerRequest request) { log.debug("processRequest的projectId,{}",request.getProjectId()); @@ -219,6 +274,16 @@ public class DefaultDebugSession implements DebugSession { this.future = future; } + private void startReplay() { + log.info("sessionId[{}]-requestId[{}]开放开始", sessionId, requestId); + this.replaying = true; + } + + private void endReplay() { + log.info("sessionId[{}]-requestId[{}]开放结束", sessionId, requestId); + this.replaying = false; + } + /** * 断开重新连接 * @@ -275,7 +340,13 @@ public class DefaultDebugSession implements DebugSession { } else if (DebugerConst.CommandConst.CMD_DEVICE_INIT.equalsIgnoreCase(cmd)) {//应用初始化处理 handleDeviceInit(request); } else if (DebugerConst.CommandConst.CMD_REPLAY_START.equalsIgnoreCase(cmd)) {//回放指令处理 - handleReplayStart(request); + try { + handleReplayStart(request); + } catch (Exception e) { + throw e; + } finally { + endReplay(); + } } else if (DebugerConst.CommandConst.CMD_SCREEN_SHOT.equalsIgnoreCase(cmd)) { //截图 handleScreenShot(request); } else if (DebugerConst.CommandConst.CMD_DETECT_EXECUTE.equalsIgnoreCase(cmd)) { //隐式回放 @@ -486,8 +557,9 @@ public class DefaultDebugSession implements DebugSession { */ private void handleReplayStart(DebuggerRequest request) { log.debug("Begin to handle replay start"); + startReplay(); String sessionId = request.getSessionId(); - String requestId = request.getRequestId(); + requestId = request.getRequestId(); String type = (String) request.getDataValue(DebugerConst.ReqConst.KEY_REPLAY_TYPE); Object scriptData = request.getDataValue(DebugerConst.ReqConst.KEY_REPLAY_SCRIPT_DATA); Script script = null; diff --git a/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/debug/service/impl/DebugServiceImpl.java b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/debug/service/impl/DebugServiceImpl.java index ea1811b..f02e53a 100644 --- a/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/debug/service/impl/DebugServiceImpl.java +++ b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/debug/service/impl/DebugServiceImpl.java @@ -168,6 +168,21 @@ public class DebugServiceImpl implements DebugService { debugSession.stop(request); return; } + // 如果正在回放中遇到新的回放指令,那么需要替换requestId,因为前端将新的requestId替换成新的,后台如果返回旧的requestId,那么当前步骤的标识就会丢失 + if (DebugerConst.CommandConst.CMD_REPLAY_START.equalsIgnoreCase(request.getCmd())) { + if (debugSession.isReplay()) { // 处于回放中 + log.info("sessionId[{}]-requestId[{}]正在回放中,接受到新的回放,更新requestId[{}]", + debugSession.getSessionId(), debugSession.getRequestId(), request.getRequestId()); + try { + Thread.sleep(500L); // 用于等待上一个回放指令的预处理 + } catch (InterruptedException e) { + log.error("等待过程被打断"); + } + debugSession.setRequestId(request.getRequestId()); + debugSession.updateRequestId(); + return; // 已经在回放,不接受新的回放指令信息 + } + } debugSession.processRequest(request); } diff --git a/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/script/core/ScriptExecutor.java b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/script/core/ScriptExecutor.java index 9193ce2..0ca70da 100644 --- a/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/script/core/ScriptExecutor.java +++ b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/script/core/ScriptExecutor.java @@ -98,4 +98,9 @@ public interface ScriptExecutor extends IScriptRuntimeContext{ * 清空对象 */ void empty(); + + /** + * 更新执行器requestId + */ + void updateRequestId(); } diff --git a/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/script/service/ScriptRuntimeExecutor.java b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/script/service/ScriptRuntimeExecutor.java index 739a8d6..ded1228 100644 --- a/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/script/service/ScriptRuntimeExecutor.java +++ b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/script/service/ScriptRuntimeExecutor.java @@ -2090,4 +2090,17 @@ public class ScriptRuntimeExecutor implements ScriptExecutor { } this.finishedTime = new Date(); } + + /** + * 更新执行器requestId + */ + @Override + public void updateRequestId() { + if (!sonExecutorMap.isEmpty()) { + for (ScriptRuntimeExecutor son : sonExecutorMap.values()) { + son.setRequestId(this.requestId); + son.updateRequestId(); + } + } + } }