专栏文章 ngrinder-解决假死问题--方案 2

CC · 2020年08月06日 · 1095 次阅读

针对方案 1,这种处理从产品角度而言,不可取,且过于粗暴;
且正在任务执行过程中,也确实不应该存在删除 case 的行为;因此综合下来;考虑在原来的操作基础上,点击 停止按钮,真正的进行停止问题修复;
采取方案:
1、进行停止时
2、先 stop 所有的 agent
3、再更新此次性能测试执行 status 为人为取消

服务修改

org.ngrinder.perftest.service.PerfTestService


        //最终不可修改状态
    private Set<Status> statusSet = ImmutableSet.of(Status.CANCELED,
        Status.STOP_BY_ERROR,Status.UNKNOWN,Status.FINISHED);

        @Autowired
    private AgentManagerService agentManagerService;

        @Override
    @Transactional
    public void stop(User user, Long id) {
        PerfTest perfTest = getOne(id);
        // If it's not requested by user who started job. It's wrong request.
        if (!hasPermission(perfTest, user, Permission.STOP_TEST_OF_OTHER)) {
            return;
        }
//      // If it's not stoppable status.. It's wrong request.
//      if (!perfTest.getStatus().isStoppable()) {
//          return;
//      }

        // Just mark cancel on console
        // This will be not be effective on cluster mode.
        consoleManager.getConsoleUsingPort(perfTest.getPort()).cancel();
        perfTest.setStopRequest(true);
        perfTest.setStatus(Status.CANCELED);

        List<AgentInfo> agents = agentManagerService.getAllVisible();
        for(AgentInfo agentInfo : agents){
            agentManagerService.stopAgent(agentInfo.getId());
        }
        //1秒后再更新DB,因为断开Agent连接时,agent会通过socket管道发送当前性能case执行状态,会覆盖status
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        perfTestRepository.save(perfTest);

    }

      @Transactional
    public PerfTest markProgress(PerfTest perfTest, String message) {
        checkNotNull(perfTest);
        checkNotNull(perfTest.getId(), "perfTest should save Id");
        perfTest.setLastProgressMessage(message);
        //所有状态更新主入口,在更新前,异常错误、取消,都是最终状态,不可再次更改
        PerfTest beforCheckPerfTest = perfTestRepository.findOne(perfTest.getId());
        if(statusSet.contains(beforCheckPerfTest.getStatus())){
            return beforCheckPerfTest;
        }
        LOGGER.debug("Progress : Test - {} : {}", perfTest.getId(), message);
        return perfTestRepository.saveAndFlush(perfTest);
    }

已经按照方案 1 修改的童鞋,也不用大改,只需要在前端文件 list.ftl,把 delete 按钮的展示重新修改原样即可

//默认显示delete按钮
if (deletable == true) {
    $("#delete_" + id).show();
} else {
    $("#check_" + id).attr("disabled", true);
    $("#delete_" + id).hide();
    // $("#delete_" + id).show();
}

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
暂无回复。
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册