getThreadPoolExecutor (). getQueue (). size () возвращает ноль при работе с "@Scheduled" - PullRequest
0 голосов
/ 20 февраля 2020

Я использую @Scheduled(fixedDelay=2000) для одного из моих методов. Этот метод будет запускаться каждые 2 секунды, чтобы проверить, насколько велика очередь Thread, и если она будет меньше определенного числа, это создаст новые рабочие потоки.

У меня есть класс конфигурации Asyn c, как показано ниже

@Configuration
@ManagedResource
public class ExecutorConfig {
    @Bean(name = "detailsScraperExecutor")
    public ThreadPoolTaskExecutor getDetailsAsyncExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(100);
        // executor.setMaxPoolSize(5);
        executor.setQueueCapacity(1000000);
        executor.setThreadNamePrefix("detailsScraperExecutor-");
        executor.initialize();
        return executor;
    }
}

Ниже мой класс DetailScraper, который содержит метод, который запускается каждые 2 секунды

@Service
public class DetailsScraper {

    @Autowired
    @Qualifier("detailsScraperExecutor")
    private Executor detailsScraperExecutor;

    @Autowired
    private DetailsScraperAsync scraper;

    @Scheduled(fixedDelay=2000)
    public void scrapeDetails() {
        System.out.println("Pool size: " + ((ThreadPoolTaskExecutor) detailsScraperExecutor).getThreadPoolExecutor().getQueue().size());

        if (((ThreadPoolTaskExecutor) detailsScraperExecutor).getThreadPoolExecutor().getQueue().size() < 3) {
            System.out.println("NEED TO INCREASE!");
            for (int i = 0; i < 5; i++) {
                scraper.run("");
            }
        } else {
            System.out.println("NO NEED");
        }

    }
}

И ниже класс потока

@Service
public class DetailsScraperAsync {
    @Async("detailsScraperExecutor")
    public void run(String string) {
        try {
            System.out.println("IN WORKER THREAD");
            Thread.sleep(999999999);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {

        }
    }
}

Ниже приведен результат когда я запускаю приложение

Pool size: 0
NEED TO INCREASE!
IN WORKER THREAD
IN WORKER THREAD
IN WORKER THREAD
IN WORKER THREAD
IN WORKER THREAD
Pool size: 0
NEED TO INCREASE!
IN WORKER THREAD
IN WORKER THREAD
IN WORKER THREAD
IN WORKER THREAD
IN WORKER THREAD
Pool size: 0
NEED TO INCREASE!
IN WORKER THREAD
IN WORKER THREAD
IN WORKER THREAD
IN WORKER THREAD
IN WORKER THREAD
Pool size: 0
NEED TO INCREASE!
IN WORKER THREAD
IN WORKER THREAD
IN WORKER THREAD
IN WORKER THREAD
IN WORKER THREAD
Pool size: 0
NEED TO INCREASE!
IN WORKER THREAD
IN WORKER THREAD
IN WORKER THREAD
IN WORKER THREAD
IN WORKER THREAD
Pool size: 0
NEED TO INCREASE!
IN WORKER THREAD
IN WORKER THREAD
IN WORKER THREAD
IN WORKER THREAD
IN WORKER THREAD

Почему размер пула отображается равным нулю при каждом запуске метода scrapeDetails?

1 Ответ

0 голосов
/ 21 февраля 2020

getQueue (). Size () показывает размер очереди, и, поскольку setCorePoolSize был равен 100, очередь осталась 0. Как только я уменьшил setCorePoolSize до 5, я увидел увеличение размера очереди.

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