Постпроцессорная синхронизация jMeter BeanShell

У меня есть несколько тестов производительности в jMeter и в одном HTTP-запросе у меня есть BeanShell PostProcessor. Он должен написать адрес электронной почты пользователя в верхней части файла CSV (самый новый сверху). Очень важно, что этот файл отсортирован.

import org.apache.commons.io.FilenameUtils;
import org.apache.jmeter.services.FileServer;
import java.text.*;
import java.io.*;
import java.util.*;

try {
    String email = vars.get("emailPrefix") + "+" + vars.get("environment") + "-jm-" + vars.get("randomEmailNumber")+"@someEmail.com";
    log.info(email);
    String separator = System.getProperty("file.separator");
    File mFile = new File(FileServer.getFileServer().getBaseDir() + separator + "investors_" + vars.get("environment") + ".csv");
    BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(mFile), "UTF8"));
    String result = "";
    String line = "";
    while((line = br.readLine()) != null){
        result = result + "\n" + line; 
    }
    result = email + "," + result;
    FileOutputStream fos = new FileOutputStream(mFile);
    fos.write(result.getBytes());
    fos.flush();
} catch(Exception e) {
    System.out.println("Exception in 2 1 4 /getContactInformation::Email writer:" + e.toString());
    throw e;
}

Но когда я пытаюсь запустить, т.е. 100 потоков одновременно, иногда случается, что не все электронные письма регистрируются, или файл CSV заканчивается пустым (содержимое удаляется в середине цикла).

Моя проблема может быть решена путем чтения этого файла CSV с конца, но jMeter не может этого сделать.

Есть ли какой-нибудь простой способ, как синхронизировать этот постпроцессор, или как это переписать?

1 ответ

Кажется, что ваш тест плохо спроектирован, одновременная запись в один и тот же файл не рекомендуется, вы должны иметь реализацию ReadWriteLock или использовать контроллер критических разделов JMeter, чтобы гарантировать, что только один поток записывает что-то в файл одновременно.

Другой вариант - запустить логику создания файла CSV, прежде чем вы попытаетесь прочитать строки.

Третье (и IMHO) лучшее решение - избавиться от файла, записать все в переменную (и) JMeter или свойства и считывать значения из памяти при необходимости. Я также рекомендовал бы рассмотреть возможность перехода на JSR223 PostProcessor и язык Groovy, поскольку для вашего сценария Groovy обеспечит гораздо лучшую производительность, чем вы можете достичь с помощью Beanshell, см. Статью Groovy Is the New Black для получения дополнительной информации.

Другие вопросы по тегам