From d72fd4f0e3bdafa6359c64e53e500ae1c58ff0b4 Mon Sep 17 00:00:00 2001 From: fit2-zhao Date: Fri, 23 Jul 2021 16:46:43 +0800 Subject: [PATCH] =?UTF-8?q?fix(=E6=8E=A5=E5=8F=A3=E8=87=AA=E5=8A=A8?= =?UTF-8?q?=E5=8C=96):=20=E4=BF=AE=E5=A4=8D=E8=B0=83=E8=AF=95=E6=89=A7?= =?UTF-8?q?=E8=A1=8C=E7=BB=93=E6=9E=9C=E4=B8=A2=E5=8C=85=E9=97=AE=E9=A2=98?= =?UTF-8?q?=EF=BC=8C=E6=97=A5=E5=BF=97=E6=8E=92=E6=9F=A5DEBUG?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/jmeter/APIBackendListenerClient.java | 2 +- .../api/jmeter/JmeterLoggerAppender.java | 20 +++--- .../api/service/MsResultService.java | 70 ++++++++++++++----- .../websocket/ScenarioReportWebSocket.java | 2 +- .../websocket/TaskCenterWebSocket.java | 2 +- .../automation/scenario/EditApiScenario.vue | 8 +-- .../scenario/component/IfController.vue | 8 +-- 7 files changed, 74 insertions(+), 38 deletions(-) diff --git a/backend/src/main/java/io/metersphere/api/jmeter/APIBackendListenerClient.java b/backend/src/main/java/io/metersphere/api/jmeter/APIBackendListenerClient.java index 99172f37ef..ae6afb4be4 100644 --- a/backend/src/main/java/io/metersphere/api/jmeter/APIBackendListenerClient.java +++ b/backend/src/main/java/io/metersphere/api/jmeter/APIBackendListenerClient.java @@ -70,7 +70,6 @@ public class APIBackendListenerClient extends AbstractBackendListenerClient impl public void teardownTest(BackendListenerContext context) throws Exception { TestResult testResult = new TestResult(); testResult.setTestId(testId); - testResult.setConsole(resultService.getJmeterLogger(testId, true)); testResult.setTotal(0); // 一个脚本里可能包含多个场景(ThreadGroup),所以要区分开,key: 场景Id final Map scenarios = new LinkedHashMap<>(); @@ -87,6 +86,7 @@ public class APIBackendListenerClient extends AbstractBackendListenerClient impl super.teardownTest(context); testResult.getScenarios().addAll(scenarios.values()); testResult.getScenarios().sort(Comparator.comparing(ScenarioResult::getId)); + testResult.setConsole(resultService.getJmeterLogger(testId, true)); testResultService.saveResult(testResult, this.runMode, this.debugReportId, this.testId); } diff --git a/backend/src/main/java/io/metersphere/api/jmeter/JmeterLoggerAppender.java b/backend/src/main/java/io/metersphere/api/jmeter/JmeterLoggerAppender.java index 21d10592df..a963e2b67a 100644 --- a/backend/src/main/java/io/metersphere/api/jmeter/JmeterLoggerAppender.java +++ b/backend/src/main/java/io/metersphere/api/jmeter/JmeterLoggerAppender.java @@ -17,15 +17,17 @@ public class JmeterLoggerAppender extends UnsynchronizedAppenderBase(); } - StringBuffer message = new StringBuffer(); - message.append(DateUtils.getTimeStr(event.getTimeStamp())).append(" ") - .append(event.getLevel()).append(" ") - .append(event.getThreadName()).append(" ") - .append(event.getFormattedMessage()).append("\n"); - if (logger.containsKey(event.getTimeStamp())) { - logger.get(event.getTimeStamp()).append(message); - } else { - logger.put(event.getTimeStamp(), message); + if (!event.getLevel().levelStr.equals(LogUtil.DEBUG)) { + StringBuffer message = new StringBuffer(); + message.append(DateUtils.getTimeStr(event.getTimeStamp())).append(" ") + .append(event.getLevel()).append(" ") + .append(event.getThreadName()).append(" ") + .append(event.getFormattedMessage()).append("\n"); + if (logger.containsKey(event.getTimeStamp())) { + logger.get(event.getTimeStamp()).append(message); + } else { + logger.put(event.getTimeStamp(), message); + } } } catch (Exception e) { LogUtil.error(e); diff --git a/backend/src/main/java/io/metersphere/api/service/MsResultService.java b/backend/src/main/java/io/metersphere/api/service/MsResultService.java index cdfa9415ed..518ef3e5a7 100644 --- a/backend/src/main/java/io/metersphere/api/service/MsResultService.java +++ b/backend/src/main/java/io/metersphere/api/service/MsResultService.java @@ -13,15 +13,14 @@ import org.springframework.http.HttpMethod; import org.springframework.stereotype.Service; import sun.security.util.Cache; -import java.util.Comparator; -import java.util.LinkedHashMap; -import java.util.Map; +import java.util.*; import java.util.stream.Collectors; @Service public class MsResultService { // 零时存放实时结果 private Cache cache = Cache.newHardMemoryCache(0, 3600 * 2); + private Map> processCache = new HashMap<>(); private final static String THREAD_SPLIT = " "; @@ -34,29 +33,59 @@ public class MsResultService { return null; } + public List procResult(String key) { + if (this.processCache.get(key) != null) { + return this.processCache.get(key); + } + return new LinkedList<>(); + } + public void setCache(String key, SampleResult result) { if (key.startsWith("[") && key.endsWith("]")) { key = JSON.parseArray(key).get(0).toString(); } - TestResult testResult = this.getResult(key); + List testResult = this.procResult(key); + testResult.add(result); + this.processCache.put(key, testResult); + } + + public TestResult sysnSampleResult(String key) { + if (key.startsWith("[") && key.endsWith("]")) { + key = JSON.parseArray(key).get(0).toString(); + } + String logs = getJmeterLogger(key, false); + List results = this.processCache.get(key); + boolean isRemove = false; + TestResult testResult = (TestResult) cache.get(key); if (testResult == null) { testResult = new TestResult(); } - if (result.getResponseCode().equals(MsResultCollector.TEST_END)) { - testResult.setEnd(true); + if (CollectionUtils.isNotEmpty(results)) { + final Map scenarios = new LinkedHashMap<>(); + for (SampleResult result : results) { + if (result.getResponseCode().equals(MsResultCollector.TEST_END)) { + testResult.setEnd(true); + this.cache.put(key, testResult); + isRemove = true; + break; + } + testResult.setTestId(key); + if (StringUtils.isNotEmpty(logs)) { + testResult.setConsole(logs); + } + testResult.setTotal(0); + this.formatTestResult(testResult, scenarios, result); + } + testResult.getScenarios().clear(); + testResult.getScenarios().addAll(scenarios.values()); + testResult.getScenarios().sort(Comparator.comparing(ScenarioResult::getId)); this.cache.put(key, testResult); - return; + + if (isRemove) { + this.processCache.remove(key); + } } - testResult.setTestId(key); - testResult.setConsole(getJmeterLogger(key, false)); - testResult.setTotal(0); - final Map scenarios = new LinkedHashMap<>(); - - this.formatTestResult(testResult, scenarios, result); - - testResult.getScenarios().addAll(scenarios.values()); - testResult.getScenarios().sort(Comparator.comparing(ScenarioResult::getId)); - this.cache.put(key, testResult); + return (TestResult) cache.get(key); } public void delete(String testId) { @@ -88,7 +117,6 @@ public class MsResultService { scenarioResult.addError(result.getErrorCount()); testResult.addError(result.getErrorCount()); } - RequestResult requestResult = this.getRequestResult(result); scenarioResult.getRequestResults().add(requestResult); scenarioResult.addResponseTime(result.getTime()); @@ -114,6 +142,12 @@ public class MsResultService { .filter(map -> map.getKey() > finalStartTime && map.getKey() < endTime) .map(map -> map.getValue()).collect(Collectors.joining()); if (removed) { + if (processCache.get(testId) != null) { + try { + Thread.sleep(2000); + } catch (Exception e) { + } + } FixedTask.tasks.remove(testId); } if (FixedTask.tasks.isEmpty()) { diff --git a/backend/src/main/java/io/metersphere/websocket/ScenarioReportWebSocket.java b/backend/src/main/java/io/metersphere/websocket/ScenarioReportWebSocket.java index d6fb14d916..13ce6ab529 100644 --- a/backend/src/main/java/io/metersphere/websocket/ScenarioReportWebSocket.java +++ b/backend/src/main/java/io/metersphere/websocket/ScenarioReportWebSocket.java @@ -88,7 +88,7 @@ public class ScenarioReportWebSocket { @Override public void run() { try { - TestResult report = resultService.getResult(reportId); + TestResult report = resultService.sysnSampleResult(reportId); if (!session.isOpen()) { return; } diff --git a/backend/src/main/java/io/metersphere/websocket/TaskCenterWebSocket.java b/backend/src/main/java/io/metersphere/websocket/TaskCenterWebSocket.java index 5b7c510e19..da0a229ba6 100644 --- a/backend/src/main/java/io/metersphere/websocket/TaskCenterWebSocket.java +++ b/backend/src/main/java/io/metersphere/websocket/TaskCenterWebSocket.java @@ -31,7 +31,7 @@ public class TaskCenterWebSocket { public void onOpen(@PathParam("projectId") String projectId, Session session) { Timer timer = new Timer(true); TaskCenterWebSocket.TaskCenter task = new TaskCenterWebSocket.TaskCenter(session, projectId); - timer.schedule(task, 0, 6 * 1000); + timer.schedule(task, 0, 10 * 1000); refreshTasks.putIfAbsent(session, timer); } diff --git a/frontend/src/business/components/api/automation/scenario/EditApiScenario.vue b/frontend/src/business/components/api/automation/scenario/EditApiScenario.vue index 99f601fdcf..4fd6353656 100644 --- a/frontend/src/business/components/api/automation/scenario/EditApiScenario.vue +++ b/frontend/src/business/components/api/automation/scenario/EditApiScenario.vue @@ -1131,12 +1131,12 @@ export default { } this.loading = false; this.sort(); + // 初始化resourceId + if (this.scenarioDefinition) { + this.resetResourceId(this.scenarioDefinition); + } }) } - // 初始化resourceId - if (this.scenarioDefinition) { - this.resetResourceId(this.scenarioDefinition); - } }, setParameter() { this.currentScenario.stepTotal = this.scenarioDefinition.length; diff --git a/frontend/src/business/components/api/automation/scenario/component/IfController.vue b/frontend/src/business/components/api/automation/scenario/component/IfController.vue index 77134af11f..0c21f019c2 100644 --- a/frontend/src/business/components/api/automation/scenario/component/IfController.vue +++ b/frontend/src/business/components/api/automation/scenario/component/IfController.vue @@ -13,7 +13,7 @@ @@ -141,7 +141,7 @@