Размер очереди превышает настроенную максимальную емкость очереди в ThreadPoolTaskExecutor, используемом при весенней загрузке - PullRequest
1 голос
/ 10 июля 2020

Посмотрите на этот фрагмент кода ниже:

@Autowired  
private ThreadPoolTaskExecutor executor;  
  
@PostConstruct
public void setupTaskExecutor() {
    this.executor.setCorePoolSize(getExecutorCorePoolSize());
    this.executor.setMaxPoolSize(getExecutorMaxPoolSize());
    this.executor.setQueueCapacity(getExecutorMaxQueueCapacity());
}  
  
public ZoneDetail getZoneDetails(ConfigRequest configRequest) {

    LOGGER.debug("QueueSize = {}", executor.getThreadPoolExecutor().getQueue().size());
    LOGGER.debug("PoolSize = {}", executor.getPoolSize());      

    Future<ZoneDetail> future = executor.submit(() -> {
        return getPrimaryProvider(context).getZoneDetails(context, 
        configRequest);
    });

    try {
        ZoneDetail zoneDetail = future.get(getPrimaryProviderTimeout(),
        TimeUnit.MILLISECONDS);
    } catch (ExecutionException | TimeoutException e) { 
        // fetch data from secondary provider
    }
        
}  

Мои настроенные значения размер основного пула = 4 максимальный размер пула = 16 max-queue-capacity = 5

Я запускаю PT с помощью SoapUI со следующими параметрами:

Threads: 20  Strategy: Simple Test Delay: 0 Limit: 5 seconds

, т.е. я использую 20 потоков за раз в течение 5 секунд.

В консоли я вижу QueueSize = 15 , т.е. размер моей очереди превышает настроенную максимальную емкость очереди 5. И PoolSize = 4 , т.е. размер моего пула никогда не превышает размер основного пула. поскольку дополнительные потоки помещаются в очередь.

Примечание: Я использую REST API, который вызывает метод getZoneDetails ()

Как это происходит? Что я делаю не так?

1 Ответ

1 голос
/ 16 июля 2020
  • Я не думаю, что ваша установка верна. Вы автоматически подключаете ThreadPoolTaskExecutor, и это означает, что он уже инициализировал ThreadPoolExecutor с помощью QueueCapacity из Integer.MAX_VALUE и создал очередь с этой емкостью. Поэтому все, что вы делаете в setupTaskExecutor(), не вступит в силу.

  • Вместо этого сделайте следующее в одном go

    @Bean(name = "myThreadPoolTaskExecutor")
    public Executor threadPoolTaskExecutor() {
        ThreadPoolTaskExecutor threadPoolTaskExecutor = 
                                             new ThreadPoolTaskExecutor();
        threadPoolTaskExecutor.setCorePoolSize(getExecutorCorePoolSize());
        threadPoolTaskExecutor.setMaxPoolSize(getExecutorMaxPoolSize());
        threadPoolTaskExecutor.setQueueCapacity(getExecutorMaxQueueCapacity());
        threadPoolTaskExecutor.initialize();
        return threadPoolTaskExecutor;
    }
  • Если вы добавите LOGGER.debug("RemainingCapacity = {}", this.executor.getThreadPoolExecutor().getQueue().remainingCapacity()) в качестве последней строки setupTaskExecutor(), он должен подтвердить этот ответ

  • И затем использовать

    @Autowired
    @Qualifier("myThreadPoolTaskExecutor")
    public ThreadPoolTaskExecutor executor;
...