性能测试接口定时任务

This commit is contained in:
2025-04-18 11:13:48 +08:00
parent 6d4e38b1fd
commit bc0b83c828
3 changed files with 247 additions and 61 deletions

View File

@@ -6,20 +6,16 @@ import com.test.test.domain.PerformanceTest;
import com.test.test.domain.TestCase;
import com.test.test.domain.qo.PerformanceTestQO;
import com.test.test.domain.vo.PerformanceTestVO;
import com.test.test.service.IPerformanceTestCaseReportService;
import com.test.test.service.IPerformanceTestService;
import com.test.test.service.ITestCaseService;
import com.test.test.task.DynamicTaskManager;
import jakarta.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.*;
import com.test.common.annotation.Log;
import com.test.common.core.controller.BaseController;
import com.test.common.core.domain.AjaxResult;
@@ -29,19 +25,24 @@ import com.test.common.core.page.TableDataInfo;
/**
* 性能测试Controller
*
*
* @author test
* @date 2025-04-14
*/
@RestController
@RequestMapping("/test/performanceTest")
@Slf4j
public class PerformanceTestController extends BaseController
{
public class PerformanceTestController extends BaseController {
@Value("${test.jmeterHomePath:/opt/apache-jmeter}")
private String jmeterHomePath;
@Autowired
private IPerformanceTestService performanceTestService;
@Autowired
private ITestCaseService testCaseService;
@Autowired
private IPerformanceTestCaseReportService performanceTestCaseReportService;
@Autowired
private DynamicTaskManager dynamicTaskManager;
/**
@@ -49,16 +50,14 @@ public class PerformanceTestController extends BaseController
*/
// @PreAuthorize("@ss.hasPermi('system:test:list')")
@GetMapping("/list")
public TableDataInfo list(PerformanceTest performanceTest)
{
public TableDataInfo list(PerformanceTest performanceTest) {
startPage();
List<PerformanceTest> list = performanceTestService.selectPerformanceTestList(performanceTest);
return getDataTable(list);
}
@GetMapping("/testCaseList")
public TableDataInfo testCaseList(TestCase testCase)
{
public TableDataInfo testCaseList(TestCase testCase) {
startPage();
List<TestCase> testCaseList = testCaseService.selectTestCaseList(testCase);
return getDataTable(testCaseList);
@@ -70,8 +69,7 @@ public class PerformanceTestController extends BaseController
// @PreAuthorize("@ss.hasPermi('system:test:export')")
@Log(title = "性能测试", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public void export(HttpServletResponse response, PerformanceTest performanceTest)
{
public void export(HttpServletResponse response, PerformanceTest performanceTest) {
List<PerformanceTest> list = performanceTestService.selectPerformanceTestList(performanceTest);
ExcelUtil<PerformanceTest> util = new ExcelUtil<PerformanceTest>(PerformanceTest.class);
util.exportExcel(response, list, "性能测试数据");
@@ -82,8 +80,7 @@ public class PerformanceTestController extends BaseController
*/
// @PreAuthorize("@ss.hasPermi('system:test:query')")
@GetMapping(value = "/{id}")
public AjaxResult getInfo(@PathVariable("id") Long id)
{
public AjaxResult getInfo(@PathVariable("id") Long id) {
return success(performanceTestService.selectPerformanceTestById(id));
}
@@ -93,16 +90,23 @@ public class PerformanceTestController extends BaseController
// @PreAuthorize("@ss.hasPermi('system:test:add')")
@Log(title = "性能测试", businessType = BusinessType.INSERT)
@PostMapping("/add")
public AjaxResult add(@RequestBody PerformanceTestQO performanceTestQO)
{
public AjaxResult add(@RequestBody PerformanceTestQO performanceTestQO) {
try {
Long l = performanceTestService.insertPerformanceTest(performanceTestQO);
if (l > 0){
return success(l);
// 获取新增的任务完整信息
PerformanceTestVO newTaskVo = performanceTestService.selectPerformanceTestById(l);
PerformanceTest entity = new PerformanceTest();
entity.setId(newTaskVo.getId());
entity.setCrontab(newTaskVo.getCrontab());
entity.setCrontabStatus(newTaskVo.getCrontabStatus());
entity.setDelFlag(newTaskVo.getDelFlag());
// 如果任务是定时任务且状态为启用,则添加到定时任务管理器
if (entity.getCrontabStatus() == 1) {
dynamicTaskManager.addNewTask(entity);
}
return error("新增失败!");
return success(l);
} catch (Exception e) {
log.info("新增失败!",e);
log.info("新增失败!", e);
return error("新增失败!");
}
}
@@ -111,21 +115,32 @@ public class PerformanceTestController extends BaseController
/**
* 新增保存并执行性能测试
*/
// @PreAuthorize("@ss.hasPermi('system:test:add')")
@Log(title = "性能测试", businessType = BusinessType.INSERT)
@PostMapping("/addAndExecute")
public AjaxResult addAndExecute(@RequestBody PerformanceTestQO performanceTestQO)
{
public AjaxResult addAndExecute(@RequestBody PerformanceTestQO performanceTestQO) {
try {
Long l = performanceTestService.insertPerformanceTest(performanceTestQO);
if (l > 0){
//todo 执行逻辑
return success(l);
// 获取新增的任务完整信息
PerformanceTestVO newTaskVo = performanceTestService.selectPerformanceTestById(l);
PerformanceTest entity = new PerformanceTest();
entity.setId(newTaskVo.getId());
entity.setCrontab(newTaskVo.getCrontab());
entity.setCrontabStatus(newTaskVo.getCrontabStatus());
entity.setDelFlag(newTaskVo.getDelFlag());
// 如果任务是定时任务且状态为启用,则添加到定时任务管理器
if (entity.getCrontabStatus() == 1) {
dynamicTaskManager.addNewTask(entity);
}
// 执行性能测试
try {
Long l1 = performanceTestCaseReportService.executePerformanceTestAndReport(l, jmeterHomePath, 2);
return success(l1);
} catch (Exception e) {
log.error("执行失败!", e);
return error("执行失败!");
}
return error("新增并执行失败!");
} catch (Exception e) {
log.info("新增并执行失败!",e);
log.error("新增并执行失败!", e);
return error("新增并执行失败!");
}
}
@@ -136,36 +151,56 @@ public class PerformanceTestController extends BaseController
// @PreAuthorize("@ss.hasPermi('system:test:edit')")
@Log(title = "性能测试", businessType = BusinessType.UPDATE)
@PutMapping
public AjaxResult edit(@RequestBody PerformanceTestQO performanceTestQO)
{
public AjaxResult edit(@RequestBody PerformanceTestQO performanceTestQO) {
try {
PerformanceTestVO originalTask = performanceTestService.selectPerformanceTestById(performanceTestQO.getId());
Long l = performanceTestService.updatePerformanceTest(performanceTestQO);
if (l > 0){
return success(l);
PerformanceTestVO updatedTask = performanceTestService.selectPerformanceTestById(performanceTestQO.getId());
// 如果crontab或crontab_status被修改了则更新定时任务
if (!updatedTask.getCrontab().equals(originalTask.getCrontab())
|| updatedTask.getCrontabStatus() != originalTask.getCrontabStatus()) {
PerformanceTest entity = new PerformanceTest();
entity.setId(updatedTask.getId());
entity.setCrontab(updatedTask.getCrontab());
entity.setCrontabStatus(updatedTask.getCrontabStatus());
entity.setDelFlag(updatedTask.getDelFlag());
dynamicTaskManager.updateTask(entity);
}
return error("修改失败!");
return success(l);
} catch (Exception e) {
log.info("修改失败!",e);
log.error("修改失败!", e);
return error("修改失败!");
}
}
@Log(title = "性能测试", businessType = BusinessType.UPDATE)
@PutMapping("editAndExecute")
public AjaxResult editAndExecute(@RequestBody PerformanceTestQO performanceTestQO)
{
try {
Long l = performanceTestService.updatePerformanceTest(performanceTestQO);
if (l > 0){
//todo 执行逻辑
return success(l);
}
return error("修改并执行失败!");
@Log(title = "性能测试", businessType = BusinessType.UPDATE)
@PutMapping("/editAndExecute")
public AjaxResult editAndExecute(@RequestBody PerformanceTestQO performanceTestQO) {
try {
PerformanceTestVO originalTask = performanceTestService.selectPerformanceTestById(performanceTestQO.getId());
Long l = performanceTestService.updatePerformanceTest(performanceTestQO);
PerformanceTestVO updatedTask = performanceTestService.selectPerformanceTestById(performanceTestQO.getId());
// 如果crontab或crontab_status被修改了则更新定时任务
if (!updatedTask.getCrontab().equals(originalTask.getCrontab())
|| updatedTask.getCrontabStatus() != originalTask.getCrontabStatus()) {
PerformanceTest entity = new PerformanceTest();
entity.setId(updatedTask.getId());
entity.setCrontab(updatedTask.getCrontab());
entity.setCrontabStatus(updatedTask.getCrontabStatus());
entity.setDelFlag(updatedTask.getDelFlag());
dynamicTaskManager.updateTask(entity);
}
try {
Long l1 = performanceTestCaseReportService.executePerformanceTestAndReport(l, jmeterHomePath, 2);
return success(l1);
} catch (Exception e) {
log.error("执行失败!", e);
return error("执行失败!");
}
} catch (Exception e) {
log.info("修改并执行失败!",e);
log.error("修改并执行失败!", e);
return error("修改并执行失败!");
}
}
@@ -175,9 +210,18 @@ public class PerformanceTestController extends BaseController
*/
// @PreAuthorize("@ss.hasPermi('system:test:remove')")
@Log(title = "性能测试", businessType = BusinessType.UPDATE)
@PutMapping("/{ids}")
public AjaxResult remove(@PathVariable Long[] ids)
{
@PutMapping("/{ids}")
public AjaxResult remove(@PathVariable Long[] ids) {
return toAjax(performanceTestService.deletePerformanceTestByIds(ids));
}
/**
* 删除性能测试
*/
// @PreAuthorize("@ss.hasPermi('system:test:remove')")
@GetMapping("/executeNow")
public AjaxResult executeNow(@RequestParam Long id) {
Long l1 = performanceTestCaseReportService.executePerformanceTestAndReport(id, jmeterHomePath, 2);
return success(l1);
}
}

View File

@@ -59,11 +59,11 @@ public class PerformanceTestServiceImpl implements IPerformanceTestService
for (PerformanceTestCase testCase : performanceTestCaseList) {
PerformanceTestCaseVO performanceTestCaseVO = new PerformanceTestCaseVO();
BeanUtils.copyProperties(testCase, performanceTestCaseVO);
performanceTestCaseVOList.add(performanceTestCaseVO);
}
for (PerformanceTestCaseVO performanceTestCaseVO : performanceTestCaseVOList) {
TestCase caseEntity = testCaseMapper.selectTestCaseById(performanceTestCaseVO.getTestCaseId());
performanceTestCaseVO.setTestCaseName(caseEntity.getName());
if (caseEntity!=null){
performanceTestCaseVOList.add(performanceTestCaseVO);
performanceTestCaseVO.setTestCaseName(caseEntity.getName());
}
}
return performanceTestVO;
}
@@ -111,7 +111,6 @@ public class PerformanceTestServiceImpl implements IPerformanceTestService
for (PerformanceTestCaseQO performanceTestCaseQO : performanceTestCaseQOList) {
PerformanceTestCase performanceTestCase = new PerformanceTestCase();
performanceTestCaseQO.setPerformanceId(id);
performanceTestCaseQO.setStatus(performanceTestCaseQO.getStatus());
BeanUtils.copyProperties(performanceTestCaseQO,performanceTestCase);
performanceTestCaseMapper.insertPerformanceTestCase(performanceTestCase);
}

View File

@@ -0,0 +1,143 @@
package com.test.test.task;
import com.test.test.domain.PerformanceTest;
import com.test.test.mapper.PerformanceTestMapper;
import com.test.test.service.IPerformanceTestCaseReportService;
import jakarta.annotation.PostConstruct;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.scheduling.TaskScheduler;
import org.springframework.scheduling.support.CronTrigger;
import org.springframework.stereotype.Component;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ScheduledFuture;
import java.util.stream.Collectors;
@Component
@Slf4j
public class DynamicTaskManager {
@Value("${test.jmeterHomePath:/opt/apache-jmeter}")
private String jmeterHomePath;
@Resource
private PerformanceTestMapper performanceTestMapper;
@Resource
private TaskScheduler taskScheduler;
@Resource
private IPerformanceTestCaseReportService performanceTestCaseReportService;
private final Map<Long, ScheduledFuture<?>> scheduledTasks = new ConcurrentHashMap<>();
private final Map<Long, PerformanceTest> taskCache = new ConcurrentHashMap<>();
@PostConstruct
public void init() {
loadTasks(); // 初始加载
// taskScheduler.scheduleWithFixedDelay(this::refreshTasks, 60000); // 每1分钟刷新
}
public void updateTask(PerformanceTest task) {
log.info("update task {}", task.getId());
Long taskId = task.getId();
// 先取消现有任务
if (scheduledTasks.containsKey(taskId)) {
scheduledTasks.get(taskId).cancel(true);
scheduledTasks.remove(taskId);
taskCache.remove(taskId);
}
// 如果任务状态是启用(1)且没有被删除,则重新调度
if (task.getCrontabStatus() == 1 && "0".equals(task.getDelFlag())) {
log.info("启动任务:{}", task.getId());
scheduleTask(task);
}
}
/**
* 添加新任务到定时调度
* @param task 性能测试任务
*/
public void addNewTask(PerformanceTest task) {
// 只有当任务状态是启用(1)且没有被删除时才创建定时任务
if (task.getCrontabStatus() == 1 && "0".equals(task.getDelFlag())) {
log.info("加入定时任务:{}", task.getId());
scheduleTask(task);
}
}
private void loadTasks() {
PerformanceTest performanceTest =new PerformanceTest();
performanceTest.setCrontabStatus(1);
performanceTest.setDelFlag("0");
List<PerformanceTest> tasks = performanceTestMapper.selectPerformanceTestList(performanceTest);
tasks.forEach(this::scheduleTask);
}
private void scheduleTask(PerformanceTest task) {
try {
CronTrigger trigger = new CronTrigger(task.getCrontab());
ScheduledFuture<?> future = taskScheduler.schedule(
() -> executeTask(task), trigger
);
scheduledTasks.put(task.getId(), future);
taskCache.put(task.getId(), task);
} catch (IllegalArgumentException e) {
// 处理无效cron表达式
log.error("无效的cron表达式: " + task.getCrontab());
}
}
private void executeTask(PerformanceTest task) {
// 执行业务逻辑
log.info("执行任务: " + task.getId());
try{
performanceTestCaseReportService.executePerformanceTestAndReport(task.getId(),jmeterHomePath,1);
} catch (Exception e) {
log.error("执行失败!",e);
}
}
private void refreshTasks() {
PerformanceTest performanceTest =new PerformanceTest();
performanceTest.setCrontabStatus(1);
performanceTest.setDelFlag("0");
List<PerformanceTest> currentTasks = performanceTestMapper.selectPerformanceTestList(performanceTest);
Set<Long> currentIds = currentTasks.stream()
.map(PerformanceTest::getId)
.collect(Collectors.toSet());
// 处理新增或更新的任务
currentTasks.forEach(task -> {
Long taskId = task.getId();
if (!scheduledTasks.containsKey(taskId)) {
scheduleTask(task); // 新增任务
} else {
PerformanceTest cached = taskCache.get(taskId);
if (!task.getCrontab().equals(cached.getCrontab())) {
// 取消旧任务并重新调度
scheduledTasks.get(taskId).cancel(true);
scheduleTask(task);
}
}
});
// 移除已禁用或删除的任务
new HashSet<>(scheduledTasks.keySet()).forEach(existingId -> {
if (!currentIds.contains(existingId)) {
scheduledTasks.get(existingId).cancel(true);
scheduledTasks.remove(existingId);
taskCache.remove(existingId);
}
});
}
}