Не выполняется запрос к API в потоках (Threads)

97
14 апреля 2022, 22:40

Пытаюсь сделать тест, имитация работы 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);
    } 
}  
Answer 1

Тут есть две проблемы:

  1. главный поток (тот в котором выполняется метод changeState ) не ждет, когда завершатся дополнительные потоки
  2. информация о успешности/неуспешности действий в дополнительных потоках не передается и не анализируется основным потоком (т.е. если произойдет любая ошибка и исключение во время выполнения запроса - основной поток об этом никак не узнает, исключение просто привет к тому, что дополнительный поток тихо прекратит свою работу).

Простой способ это исправить это воспользоваться встроенными в 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(); 
READ ALSO
Взаимодействие между контроллерами в JavaFX

Взаимодействие между контроллерами в JavaFX

Подскажите, пожалуйста, как правильно написать взаимодействие между двумя контроллерами

242
Как делается фронтенд для Java-приложений?

Как делается фронтенд для Java-приложений?

Я столкнулся с тем, что не понимаю, как обычно реализуется фронт для Java-приложенияУ меня есть несколько предположений о том, как это может...

275
gradle to maven

gradle to maven

Есть какой-нибудь конвертор gradle файла в maven?

161
Как прервать нужный поток в Java?

Как прервать нужный поток в Java?

Разбираюсь с потоками, написал такой код:

190