You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JMeter中JSR233 Sampler仅首次迭代可创建XSSFWorkbook的问题

问题解决:JMeter每次迭代创建新XSSFWorkbook失败

问题分析

第一次迭代能正常创建XSSFWorkbook并生成Excel文件,但第二次迭代采样器执行通过却无法创建工作簿,核心原因是第一次创建的Workbook资源未彻底释放,导致后续迭代无法申请新的POI资源;文件名冲突或权限问题概率极低(你已用线程号+迭代号生成唯一文件名)。

解决方案

将Workbook和OutputStream都纳入try-with-resources自动资源管理,确保每次迭代后彻底释放资源;同时优化变量引用方式,添加异常日志便于排查。

修改后的完整代码:

import org.apache.poi.xssf.usermodel.XSSFWorkbook
import org.apache.poi.ss.usermodel.Sheet
import org.apache.poi.ss.usermodel.Row
import java.io.FileOutputStream
import java.io.OutputStream

// 自动管理Workbook和输出流资源,迭代结束后自动关闭释放
try (XSSFWorkbook wb = new XSSFWorkbook();
     OutputStream fileOut = new FileOutputStream("C:/Users/saurabh.arora/Desktop/Performance/SiteService/SiteUpload/testdata/mainint/workbook${__threadNum}${__iterationNum}.xlsx")) {

    Sheet sheet = wb.createSheet("SiteList");
    // 构建表头行
    Row row = sheet.createRow(0);
    row.createCell(0).setCellValue("ErtStudyName");
    row.createCell(1).setCellValue("UniqueSiteID");
    row.createCell(2).setCellValue("SiteNumber");
    row.createCell(3).setCellValue("InvestigatorFirstName");
    row.createCell(4).setCellValue("InvestigatorLastName");
    row.createCell(5).setCellValue("InvestigatorMiddleName");
    row.createCell(6).setCellValue("ShippingAddress1");
    row.createCell(7).setCellValue("ShippingAddress2");
    row.createCell(8).setCellValue("ShippingAddress3");
    row.createCell(9).setCellValue("ShippingAddress4");
    row.createCell(10).setCellValue("InstitutionName");
    row.createCell(11).setCellValue("City");
    row.createCell(12).setCellValue("PostalCode");
    row.createCell(13).setCellValue("Country");
    row.createCell(14).setCellValue("Region");
    row.createCell(15).setCellValue("ShippingPhone");
    row.createCell(16).setCellValue("ShippingPhoneExtension");
    row.createCell(17).setCellValue("ShippingFax");
    row.createCell(18).setCellValue("SiteAction");

    // 构建数据行
    row = sheet.createRow(1);
    row.createCell(0).setCellValue(vars.get("studyname"));
    row.createCell(1).setCellValue("Uniques_" + vars.get("id2"));
    row.createCell(2).setCellValue(vars.get("id2"));
    row.createCell(3).setCellValue("InvestigatorFirstName1");
    row.createCell(4).setCellValue("LAstName1");
    //row.createCell(5).setCellValue("InvestigatorMiddleName");
    row.createCell(6).setCellValue("adrres1");
    row.createCell(7).setCellValue("adrres2");
    //row.createCell(8).setCellValue("ShippingAddress3");
    //row.createCell(9).setCellValue("ShippingAddress4");
    row.createCell(10).setCellValue("Institution");
    row.createCell(11).setCellValue("Newyork");
    row.createCell(12).setCellValue(32133);
    row.createCell(13).setCellValue("India");
    row.createCell(14).setCellValue("NYC");
    row.createCell(15).setCellValue("312312312");
    row.createCell(16).setCellValue("312312312");
    //row.createCell(17).setCellValue("ShippingFax");
    row.createCell(18).setCellValue("Create");

    // 写入文件
    wb.write(fileOut);
} catch (Exception e) {
    log.error("Excel创建/写入失败", e);
    throw e; // 抛出异常让JMeter标记采样器失败,便于定位问题
}

关键优化点

  1. 资源自动释放:将XSSFWorkbook加入try-with-resources,迭代结束后自动关闭,彻底释放POI占用的内存和文件句柄,避免资源泄漏。
  2. 高效变量引用:用vars.get("变量名")替代${变量名},Groovy中直接调用JMeter变量API性能更优,也避免字符串插值可能带来的问题。
  3. 异常日志:添加异常捕获和日志输出,若第二次迭代仍失败,可通过JMeter日志查看具体错误(比如文件路径权限、磁盘空间不足等)。
  4. 文件名唯一性:保留${__threadNum}和${__iterationNum}确保每个线程、每次迭代生成的文件名唯一,避免文件覆盖。

内容的提问来源于stack exchange,提问作者Saurabh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 03:29:54