diff --git a/backend/src/main/java/io/metersphere/commons/utils/ShiroUtils.java b/backend/src/main/java/io/metersphere/commons/utils/ShiroUtils.java index 348f2f0508..95a0757129 100644 --- a/backend/src/main/java/io/metersphere/commons/utils/ShiroUtils.java +++ b/backend/src/main/java/io/metersphere/commons/utils/ShiroUtils.java @@ -29,6 +29,7 @@ public class ShiroUtils { filterChainDefinitionMap.put("/display/file/**", "anon"); filterChainDefinitionMap.put("/jmeter/download/**", "anon"); filterChainDefinitionMap.put("/jmeter/ping", "anon"); + filterChainDefinitionMap.put("/jmeter/ready/**", "anon"); filterChainDefinitionMap.put("/authsource/list/allenable", "anon"); filterChainDefinitionMap.put("/sso/signin", "anon"); filterChainDefinitionMap.put("/sso/callback", "anon"); diff --git a/backend/src/main/java/io/metersphere/performance/controller/JmeterFileController.java b/backend/src/main/java/io/metersphere/performance/controller/JmeterFileController.java index bfd76594f6..1e328e16f0 100644 --- a/backend/src/main/java/io/metersphere/performance/controller/JmeterFileController.java +++ b/backend/src/main/java/io/metersphere/performance/controller/JmeterFileController.java @@ -1,6 +1,8 @@ package io.metersphere.performance.controller; +import io.metersphere.commons.utils.WeakConcurrentHashMap; +import io.metersphere.controller.handler.annotation.NoResultHolder; import io.metersphere.performance.service.JmeterFileService; import org.springframework.http.HttpHeaders; import org.springframework.http.MediaType; @@ -12,25 +14,41 @@ import org.springframework.web.bind.annotation.RestController; import javax.annotation.Resource; import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; @RestController @RequestMapping("jmeter") public class JmeterFileController { @Resource private JmeterFileService jmeterFileService; + private final WeakConcurrentHashMap> readyMap = new WeakConcurrentHashMap<>(600_000);// 默认保留10分钟 @GetMapping("ping") public String checkStatus() { return "PONG"; } + @GetMapping("ready") + @NoResultHolder + public long ready(@RequestParam("reportId") String reportId, @RequestParam("ratio") String ratio, + @RequestParam("resourceIndex") int resourceIndex) { + try { + List ratios = readyMap.getOrDefault(reportId, Arrays.stream(ratio.split(",")).map(Double::parseDouble).collect(Collectors.toList())); + ratios.set(resourceIndex, -1.0); + readyMap.put(reportId, ratios); + return ratios.stream().filter(r -> r > 0).count(); + } catch (Exception e) { + return 0; + } + } + @GetMapping("download") public ResponseEntity downloadJmeterFiles(@RequestParam("testId") String testId, @RequestParam("resourceId") String resourceId, @RequestParam("ratio") String ratio, @RequestParam("reportId") String reportId, @RequestParam("resourceIndex") int resourceIndex) { - long startTime = System.currentTimeMillis(); double[] ratios = Arrays.stream(ratio.split(",")).mapToDouble(Double::parseDouble).toArray(); - byte[] bytes = jmeterFileService.downloadZip(testId, ratios, startTime, reportId, resourceIndex); + byte[] bytes = jmeterFileService.downloadZip(testId, ratios, reportId, resourceIndex); return ResponseEntity.ok() .contentType(MediaType.parseMediaType("application/octet-stream")) .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + testId + ".zip\"") diff --git a/backend/src/main/java/io/metersphere/performance/engine/EngineContext.java b/backend/src/main/java/io/metersphere/performance/engine/EngineContext.java index dce38bf85a..05b23d5a50 100644 --- a/backend/src/main/java/io/metersphere/performance/engine/EngineContext.java +++ b/backend/src/main/java/io/metersphere/performance/engine/EngineContext.java @@ -10,7 +10,6 @@ public class EngineContext { private String fileType; private String content; private String resourcePoolId; - private Long startTime; private String reportId; private Integer resourceIndex; private Map properties = new HashMap<>(); @@ -76,14 +75,6 @@ public class EngineContext { this.resourcePoolId = resourcePoolId; } - public Long getStartTime() { - return startTime; - } - - public void setStartTime(Long startTime) { - this.startTime = startTime; - } - public String getReportId() { return reportId; } diff --git a/backend/src/main/java/io/metersphere/performance/engine/EngineFactory.java b/backend/src/main/java/io/metersphere/performance/engine/EngineFactory.java index efa6c6d22c..86adc07628 100644 --- a/backend/src/main/java/io/metersphere/performance/engine/EngineFactory.java +++ b/backend/src/main/java/io/metersphere/performance/engine/EngineFactory.java @@ -88,7 +88,7 @@ public class EngineFactory { return null; } - public static EngineContext createContext(LoadTestWithBLOBs loadTest, double[] ratios, long startTime, String reportId, int resourceIndex) { + public static EngineContext createContext(LoadTestWithBLOBs loadTest, double[] ratios, String reportId, int resourceIndex) { final List fileMetadataList = performanceTestService.getFileMetadataByTestId(loadTest.getId()); if (org.springframework.util.CollectionUtils.isEmpty(fileMetadataList)) { MSException.throwException(Translator.get("run_load_test_file_not_found") + loadTest.getId()); @@ -104,7 +104,6 @@ public class EngineFactory { engineContext.setNamespace(loadTest.getProjectId()); engineContext.setFileType(FileType.JMX.name()); engineContext.setResourcePoolId(loadTest.getTestResourcePoolId()); - engineContext.setStartTime(startTime); engineContext.setReportId(reportId); engineContext.setResourceIndex(resourceIndex); diff --git a/backend/src/main/java/io/metersphere/performance/parse/xml/reader/jmx/JmeterDocumentParser.java b/backend/src/main/java/io/metersphere/performance/parse/xml/reader/jmx/JmeterDocumentParser.java index 736c5b7d56..6d4d8cb510 100644 --- a/backend/src/main/java/io/metersphere/performance/parse/xml/reader/jmx/JmeterDocumentParser.java +++ b/backend/src/main/java/io/metersphere/performance/parse/xml/reader/jmx/JmeterDocumentParser.java @@ -655,7 +655,6 @@ public class JmeterDocumentParser implements DocumentParser { // 添加关联关系 test.id test.name test.startTime test.reportId collectionProp.appendChild(createKafkaProp(document, "test.id", context.getTestId())); collectionProp.appendChild(createKafkaProp(document, "test.name", context.getTestName())); - collectionProp.appendChild(createKafkaProp(document, "test.startTime", context.getStartTime().toString())); collectionProp.appendChild(createKafkaProp(document, "test.reportId", context.getReportId())); elementProp.appendChild(collectionProp); diff --git a/backend/src/main/java/io/metersphere/performance/service/JmeterFileService.java b/backend/src/main/java/io/metersphere/performance/service/JmeterFileService.java index 75a9ed54f9..2de440f59d 100644 --- a/backend/src/main/java/io/metersphere/performance/service/JmeterFileService.java +++ b/backend/src/main/java/io/metersphere/performance/service/JmeterFileService.java @@ -29,10 +29,10 @@ public class JmeterFileService { @Resource private ExtLoadTestReportMapper extLoadTestReportMapper; - public byte[] downloadZip(String testId, double[] ratios, long startTime, String reportId, int resourceIndex) { + public byte[] downloadZip(String testId, double[] ratios, String reportId, int resourceIndex) { try { LoadTestWithBLOBs loadTest = loadTestMapper.selectByPrimaryKey(testId); - EngineContext context = EngineFactory.createContext(loadTest, ratios, startTime, reportId, resourceIndex); + EngineContext context = EngineFactory.createContext(loadTest, ratios, reportId, resourceIndex); return zipFilesToByteArray(context); } catch (MSException e) { LogUtil.error(e.getMessage(), e);