. Я выполняю некоторые тесты нагрузки снова в приложении Spring, и теперь я немного запутался в конфигурации ThreadPoolTaskExecutor
.Проблемы с размером бассейна SpringPoolTaskExecutor от Spring.
Документация внутренне используется ThreadPoolExecutor
описывает corePoolSize
, как «число потоков, чтобы держать в бассейне, даже если они находятся в режиме ожидания, [...]» и maximumPoolSize
как «максимальное количество потоков, чтобы в бассейн".
Это означает, что maximumPoolSize
ограничивает количество потоков в пуле. Но вместо этого предел кажется установленным corePoolSize
. На самом деле я сконфигурировал только corePoolSize
с 100
, и пусть maximumPoolSize
не сконфигурирован (это означает, что используется значение по умолчанию: Integer.MAX_VALUE
= 2147483647
).
Когда я запускаю нагрузочный тест, я вижу (просматривая журналы), что выполненный рабочий поток пронумерован от worker-1
до worker-100
. Поэтому в этом случае размер пула потоков ограничен corePoolSize
. Даже если я установил maximumPoolSize
на 200
или 300
, результат будет таким же.
Почему стоимость maximumPoolSize
не влияет на мой случай?
@Bean
public TaskExecutor taskExecutor() {
ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();
taskExecutor.setCorePoolSize(100);
taskExecutor.setThreadNamePrefix("worker-");
return taskExecutor;
}
РЕШЕНИЕ
Я нашел решение в документации: "Если есть больше, чем corePoolSize, но меньше, чем maximumPoolSize нитей работает, новый поток создается только если очередь полный ". Размер очереди по умолчанию - Integer.MAX_VALUE
. Если я ограничу очередь, все будет хорошо.
Если я не определяю компонент пула потоков, «SimpleAsyncTaskExecutor» используется автоматически. При этом с исполнителем (без ограничений) результаты в 3 раза лучше. Если я установил размер основного пула «ThreadPoolTaskExecutor» на 20, максимальные используемые потоки равны 20. При меньшем размере пула результат хуже, это не может быть решением! – baymon
Попробуйте поместить Thread.sleep (1000) в свой рабочий код. – luboskrnac