Не выполняется запрос к API в потоках (Threads)
Пытаюсь сделать тест, имитация работы 2х пользователей над док-м. Использую библиотеки RestAssured и JerseyTest. Делаю задание на выполнение запроса к API сервиса, помещаю задание в потоки, но при прохождении теста в Thread запрос почему то не выполняется, если выполнять без потоков, то все ок. Думал проблема в библиотеках, подключил Jersey, но не помогло. Может кто сталкивался с такой проблемой ?
@Test
@DisplayName( "test" )
void changeState() {
try {
Runnable task = () -> {
logger.debug( "start" );
Response response = RestAssured.get( "https://api.github.com/users/eugenp" );
logger.debug( "stop" );
};
Executor executor = ( runnable) -> {
new Thread(runnable).start();
};
executor.execute(task);
executor.execute(task);
} catch( SQLException e ) {
Assertions.fail(e);
}
}
Ответы (1 шт):
Автор решения: Roman Konoval
→ Ссылка
Тут есть две проблемы:
- главный поток (тот в котором выполняется метод
changeState) не ждет, когда завершатся дополнительные потоки - информация о успешности/неуспешности действий в дополнительных потоках не передается и не анализируется основным потоком (т.е. если произойдет любая ошибка и исключение во время выполнения запроса - основной поток об этом никак не узнает, исключение просто привет к тому, что дополнительный поток тихо прекратит свою работу).
Простой способ это исправить это воспользоваться встроенными в java средствами для запуска потоков, а именно ExecutorService:
Callable<Boolean> task = () -> {
logger.debug( "start" );
Response response = RestAssured.get( "https://api.github.com/users/eugenp" );
logger.debug( "stop" );
return true;
};
ExecutorService executor = Executors.newFixedThreadPool(5);
Future<String> future1 = executor.submit(task);
Future<String> future2 = executor.submit(task);
// get дождется конца выполнения task
// Если случится исключение во время выполнения задачи, то get
// бросит ExecutionException
future1.get();
future2.get();