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(); + } + } + } }