参考过文章 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();
}
最终实现效果