Задача Получение отклонено из-за максимального размера пула в ThreadPoolExecutor - PullRequest
0 голосов
/ 04 декабря 2018

Приложение настроило Zuul и Eureka для маршрутизации запроса к внутренним службам, и все работает нормально, пока мы не проведем нагрузочное тестирование.

Я начал выполнять с 10 одновременными запросами в нашей среде нагрузочного тестирования и получил ошибку пересылки в шлюзе zuul, и причина была в том, что пул потоков не смог выделить поток для будущей задачи и отклонить задачи, с ошибкой ниже.

Caused by: java.util.concurrent.RejectedExecutionException: Task 
java.util.concurrent.FutureTask@70fe89b5 rejected from 
java.util.concurrent.ThreadPoolExecutor@25df1748[Running, pool size = 10, 
active threads = 10, queued tasks = 0, completed tasks = 1502]

Мое чудо;Вышеупомянутая причина, я вижу, что размер пула был только 10, и 10 потоков были заняты, практично, так как я запускал 10 последовательных запросов.

Но мой corepoolsize должен быть намного больше, чем то, что я вижу здесь, из счета 10. Чем вызвано ограничение моего приложения размером 10 пулов, могу ли я увеличить corepoolsize и maxpoolsize в моем приложении.

Ответы [ 2 ]

0 голосов
/ 04 декабря 2018

A RejectedExecutionException может быть выдан ThreadPoolExecutor по нескольким причинам, согласно javadocs:

  • Если запрос не может быть поставлен в очередь, и не может быть создан другой поток пулапотому что это превысит maxPoolSize.

  • Если метод shutdown() уже был вызван для исполнителя.

Теперь вы говоритечто вы используете Java-исполнитель по умолчанию, но немного неясно, что вы подразумеваете под этим.(Если бы вы показали нам, как вы получаете и используете этого исполнителя, вам будет легче понять вашу проблему!)

Но суть в том, что размер пула вряд ли будет причиной ваших проблем с отклоненными задачами,Если все работники заняты, задачи должны быть поставлены в очередь.


, но я вижу, что размер пула составляет всего 10, что не подходит для реального сценария [жизни]

Размер пула 10 подходит для многих сценариев реальной жизни.Но если он не подходит для вашего сценария, вам следует подумать о создании исполнителя с большим (или меньшим) пулом.

0 голосов
/ 04 декабря 2018

Вопрос в том, какой ThreadPool вы используете?Вы можете определить различные ExecutorServices в Java, например, Кэшированный пул потоков для неизвестного числа потоков, что решит вашу проблему (Пример кода одного из моих проектов):

ExecutorService pool = Executors.newCachedThreadPool();
    for(FluentCreate create: creates) {
        pool.execute(()->{
            try {
                create.execute();
            } catch (JiraException | IOException | ParseException | RestException | URISyntaxException e) {
                e.printStackTrace();
            }
        });
    }
pool.shutdown();
pool.awaitTermination(Long.MAX_VALUE, TimeUnit.MILLISECONDS);

Если вы можетепредсказать количество задач, которые можно выполнить с помощью пула фиксированных потоков.

Executors.newFixedThreadPool(3);
...