首页 > 解决方案 > 在运行 1000 个线程时,文件被覆盖在 BeanShell PostProcessor Jmeter 中追加

问题描述

我在 beanshall 后处理器下编写了以下代码。但是当我运行 1000 个线程时,文件会覆盖现有的附加内容。它适用于 1-5 个线程。谁可以帮我这个事?

import org.apache.commons.io.FileUtils;
import java.util.ArrayList;
import java.util.Collections;
File fExceptionLog = new File("${logPath}/ExceptionLog.txt");
String extExceptionData= FileUtils.readFileToString(fExceptionLog);
id=vars.get("id");
try{
String cDatestamp="${__time(yyyyMMddHHmmssSSS)}";
String cResponce = prev.getResponseDataAsString();
String cRequest = prev.getQueryString();
String cResponceCode=prev.getResponseCode();
cTransactionName = prev.getSampleLabel();
cResponseTime = prev.getTime();
cSize = prev.getBytesAsLong();
cIsSuccessful =prev.isSuccessful();
File fRequestLog = new File("${logPath}/RequestLog.txt");
File fHitLog = new File("${logPath}/HitLog.txt");
File fResponceLog = new File("${logPath}/ResponceLog.txt");
File fErrorLog = new File("${logPath}/ErrorLog.txt");
String extHitData = FileUtils.readFileToString(fHitLog);
String extRequestData = FileUtils.readFileToString(fRequestLog);
String extResponceData = FileUtils.readFileToString(fResponceLog);
String extErrorData = FileUtils.readFileToString(fErrorLog);
log.info("cResponceCode"+cResponceCode);
FileUtils.writeStringToFile(fHitLog,extHitData+id+"~"+cDatestamp+"~"+cTransactionName+"~"+cResponceCode+"~"+cResponseTime+"~"+cSize+"~"+cIsSuccessful+"\n"); 
if(cResponceCode.equals("200")){
    FileUtils.writeStringToFile(fRequestLog,extRequestData+id+"~"+cDatestamp+"~"+cTransactionName+"~"+cResponce+"\n");
    FileUtils.writeStringToFile(fResponceLog,extResponceData+id+"~"+cDatestamp+"~"+cResponceCode+"~"+cResponce+"\n");
}else{
  FileUtils.writeStringToFile(fErrorLog,extErrorData+id+"~"+cDatestamp+"~"+cTransactionName+"~"+cResponce+"\n"+id+"~"+cDatestamp+"~"+cResponceCode+"~"+cResponce+"\n");
}
}catch(Exception e){
FileUtils.writeStringToFile(fExceptionLog,extExceptionData+id+"~"+cDatestamp+"~"+cTransactionName+"~"+e+"\n");
}

标签: jmeterbeanshell

解决方案


您至少违反了 3 个JMeter 最佳实践

  1. 您指的是JMeter 变量,就像${logPath}您应该使用vars速记一样vars.get("logPath")
  2. 从 JMeter 3.1 开始使用 Beanshell,您应该使用 JSR223 和 Groovy
  3. 最后但并非最不重要的一点是,您自己引入了竞争条件,因此当多个线程同时写入同一个文件时,将导致数据丢失。您可以将此 Beanshell 测试元素(与父采样器一起)放在关键部分控制器下,但它会将父采样器的并发性减少到一次只有一个

如果您需要以自己的格式将一些指标写入自定义文件,我宁愿建议考虑迁移到灵活文件编写器,它在存储什么值方面非常“灵活”,并且它会在内存中累积多个条目并刷新它们以批处理方式定期进行,因此所有数据都将被存储而不会发生冲突。

您可以使用JMeter 插件管理器安装灵活的文件编写器

在此处输入图像描述


推荐阅读