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

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

参考过文章 https://testerhome.com/topics/5180 的解决方案,这层解决只是 UI 层的解决;
当 agent 处于文件接收状态时,删除之后,agent 假死;
因此较好的解决方案方式:
1、当前记录处于准备&执行测试阶段
2、stop 所有 agent
3、删除测试记录

实现源码如下:

前端改造

在前端文件 list.ftl
delete 按钮上新增 istatus 属性,后续处理中根据状态进行 agent 停止

<td class="center">
            <i title="<@spring.message 'perfTest.action.showChart'/>" id="show_${test.id}"
               style="<#if !test.status.isReportable() || (test.tests!0) + (test.errors!0) == 0>display: none;</#if>"
               class="icon-download test-display pointer-cursor"  sid="${test.id}" ></i>
<#--            delete按钮上新增 istatus属性后续处理中根据状态进行agent 停止-->
            <i title="<@spring.message "common.button.delete"/>" id="delete_${test.id}"
               style="display"
               class="icon-remove test-remove pointer-cursor" sid="${test.id}" istatus="${test.status}"></i>
            <i title="<@spring.message "common.button.stop"/>" id="stop_${test.id}"
               style="<#if stoppable>display: none;</#if>"
               class="icon-stop test-stop pointer-cursor" sid="${test.id}"></i>
</td>

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

处理删除测试文件逻辑中新增 stopAllAgent 逻辑

$("i.test-remove").click(function () {
        var id = $(this).attr("sid");
        var iStatus = $(this).attr("istatus");
        console.log(iStatus);
        bootbox.confirm("<@spring.message "perfTest.message.delete.confirm"/>", "<@spring.message "common.button.cancel"/>", "<@spring.message "common.button.ok"/>", function (result) {
            if (result) {
                //删除之前,先执行停止命令
                //有且只有一条记录的时候,且当前记录处于执行状态,才进行stop行为

                if(isRunningStatusType(iStatus) || "DISTRIBUTE_FILES" == iStatus){
                    stopAllAgents("All");
                }
                deleteTests(id);
                setTimeout(getList(), 1000);
            }
        });
    });

function stopAllAgents(ids) {
    var ajaxObj = new AjaxPutObj("/agent/api?action=stop",
        { ids : ids },
        "<@spring.message 'agent.message.stop.success'/>",
        "<@spring.message 'agent.message.stop.error'/>");
    ajaxObj.success = function () {
        setTimeout(function () {
            location.reload();
        }, 2000);
    };
    ajaxObj.call();
}

后端改造

停止 agent 服务中新增针对 all 参数处理
org.ngrinder.agent.controller.AgentManagerController#stop(java.lang.String)

@RestAPI
    @PreAuthorize("hasAnyRole('A')")
    @RequestMapping(value = "/api", params = "action=stop", method = RequestMethod.PUT)
    public HttpEntity<String> stop(@RequestParam("ids") String ids) {

//      //针对删除测试脚本前,先进行服务停止,代码增加优化
        if(ids.equalsIgnoreCase("All")){
            List<AgentInfo> agents = getAllVisible();
            for(AgentInfo agentInfo : agents){
                stop(agentInfo.getId());
            }
            return successJsonHttpEntity();
        }

        String[] split = StringUtils.split(ids, ",");
        for (String each : split) {
            stop(Long.parseLong(each));
        }
        return successJsonHttpEntity();
    }

最终实现效果

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