jmeter - 在运行 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");
}
解决方案
您至少违反了 3 个JMeter 最佳实践
- 您指的是JMeter 变量,就像
${logPath}
您应该使用vars
速记一样vars.get("logPath")
- 您从 JMeter 3.1 开始使用 Beanshell,您应该使用 JSR223 和 Groovy
- 最后但并非最不重要的一点是,您自己引入了竞争条件,因此当多个线程同时写入同一个文件时,将导致数据丢失。您可以将此 Beanshell 测试元素(与父采样器一起)放在关键部分控制器下,但它会将父采样器的并发性减少到一次只有一个
如果您需要以自己的格式将一些指标写入自定义文件,我宁愿建议考虑迁移到灵活文件编写器,它在存储什么值方面非常“灵活”,并且它会在内存中累积多个条目并刷新它们以批处理方式定期进行,因此所有数据都将被存储而不会发生冲突。
您可以使用JMeter 插件管理器安装灵活的文件编写器
推荐阅读
- c++ - 为什么这个循环中需要分号?
- xml - 从 Oracle DB 根据 Key 从 CDATA 中提取值
- ruby-on-rails - 带参数的 Ransack 排序范围
- ruby-on-rails - 密码重置令牌泄露给谷歌分析
- asynchronous - 如何使用 Google Apps Script webapp 发送延迟响应(Slack api)?
- mathematical-optimization - minizinc 中条件变量
- python - 从两个元组列表(随机顺序)中取两个值并相乘
- javascript - 使用文字转语音消息发起呼叫
- pacemaker - 配置起搏器的src addr
- ssl - 智能手机浏览器上基于 SSL 的 socketIO