如何循环发送HTTP请求直至返回400并批量删除JDBC查询记录?
解决方法
一、实现批量删除所有查询到的记录
你当前的JSR223脚本只提取了第一条记录的ID,要删除所有查询结果,推荐两种实现方式:
方式1:用ForEach Controller遍历所有ID
- 确认JDBC请求的「变量名」设置为
unavailabilityid,JMeter会自动生成unavailabilityid_1、unavailabilityid_2这类变量,同时unavailabilityid_#会存储记录总数。 - 添加ForEach Controller,配置:
- 输入变量前缀:
unavailabilityid - 输出变量名称:
current_del_id
- 输入变量前缀:
- 把HTTP删除请求放到该控制器下,请求中用
${current_del_id}作为要删除的ID参数。 - 你的Scenario判断逻辑可以保留,放到ForEach Controller外层的JSR223 PreProcessor中即可。
方式2:修改JSR223脚本+Loop Controller
如果更倾向用脚本处理:
- 先在全局的JSR223 PreProcessor中初始化总记录数:
def scenario = vars.get("Scenario") if (scenario.contains("epx_diary_Unavailability_Del_old")) { def resultList = vars.getObject("unavailabilityid") vars.put("total_count", String.valueOf(resultList.size())) vars.put("loop_index", "0") }
- 添加Loop Controller,循环次数填
${total_count}。 - 在HTTP请求的JSR223 PreProcessor中获取当前循环对应的ID:
def index = Integer.parseInt(vars.get("loop_index")) def resultList = vars.getObject("unavailabilityid") vars.put("unavailabilityid", resultList.get(index).get("id")) vars.put("loop_index", String.valueOf(index + 1))
二、循环发送请求直到返回400状态码(完全可行)
用While Controller就能实现:
- 添加While Controller,条件设置为:
${__jexl3(${JMeterThread.last_sample_ok},)},这个条件表示只要上一个请求执行成功(状态码非4xx/5xx),就继续循环。 - 把HTTP删除请求放到该控制器内部。
- 可选:添加Response Assertion,设置「响应代码」不匹配
400,这样当请求返回400时,JMeterThread.last_sample_ok会变为false,循环自动终止。
注意:如果400是因为记录已删完,建议在循环前先通过JDBC获取所有ID,避免无效循环;也可以在While Controller内部每次循环前重新执行JDBC查询,确认还有待删记录。
内容的提问来源于stack exchange,提问作者Madhu Manohar
相关产品推荐
相关产品推荐

