Файлы перезаписываются при добавлении в BeanShell PostProcessor Jmeter при выполнении 1000 потоков - PullRequest
0 голосов
/ 05 мая 2020

Я написал ниже код для постпроцессора 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");
}

1 Ответ

0 голосов
/ 05 мая 2020

Вы нарушаете как минимум 3 Рекомендации JMeter

  1. Вы ссылаетесь на Переменные JMeter например ${logPath}, в то время как вы должны использовать vars вместо сокращения, например, vars.get("logPath")
  2. Вы используете Beanshell, а , начиная с JMeter 3.1, вы должны использовать JSR223 и Groovy
  3. И последнее, но не по крайней мере, вы сами ввели условие гонки , поэтому, когда несколько потоков будут одновременно записывать один и тот же файл, это приведет к потере данных. Вы можете поместить этот тестовый элемент Beanshell (вместе с родительскими сэмплерами) в Контроллер критического раздела , но это уменьшит параллелизм родительских сэмплеров до одного за раз

Если вам нужно записать некоторые метрики в пользовательский файл в вашем собственном формате, я бы рекомендовал рассмотреть возможность перехода на Flexible File Writer , который чрезвычайно "гибок" в отношении того, какие значения заключается в том, чтобы хранить, и он накапливает несколько записей в памяти и периодически сбрасывает их в пакетном режиме, поэтому все данные будут храниться без конфликтов.

Вы можете установить Flexible File Writer, используя JMeter Plugins Manager

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...