EmbeddedTomcat и атрибут startStopThreads

Я искал все вокруг и не нашел хороших объяснений или примеров использования Spring 4.x (Springboot) с контейнером EmbdedTomcat и ручной установки атрибута startStopThreads, описанного здесь

Я заметил, что задержка запуска нашего приложения со временем увеличивается, но также вижу (в журналах), что пул потоков, помеченный [localhost-startStop-1], является единственным потоком, который когда-либо выполнялся после [main]. Я хотел бы добавить больше потоков в этот пул, чтобы ускорить наш асинхронный запуск.

Может ли кто-нибудь помочь мне с проблемой Tomcat startStopThreads?


ОБНОВЛЕНИЕ.
Хорошим вариантом использования для этого является динамическое создание таблиц DynamoDb при запуске. Код создания заключен в вызов Executor.submit, однако журналы показывают, что они выполняются последовательно. Вот пример того, что в логах:

2017-02-22 15:000:000:01,000 [main                 ] INFO Creating table 1 
2017-02-22 15:000:000:05,000 [localhost-startStop-1] INFO Creating table 2
2017-02-22 15:000:000:10,000 [localhost-startStop-1] INFO Creating table 3

К сожалению, я никогда не видел, чтобы localhost-startStop-2 выполнял что-либо, что должно было быть, если бы оно было в пуле потоков.


person Dan    schedule 22.02.2017    source источник
comment
Я думаю, возможно, вам нужно создать bean-компонент EmbeddedServletContainerFactory, как в ответе на это ТАК вопрос. Существуют различные server.tomcat переменные, которые можно установить в application.properties, описанные в Документы Spring, но я не вижу startStopThreads.   -  person whistling_marmot    schedule 22.02.2017
comment
У меня есть собственный EmbeddedServletContainerFactory, и я пытался установить свойства server.tomcat.maxThreads и server.tomcat.spareThreads, но это не помогло. Мне даже удалось найти объект Host и добавить значение для его атрибута setStartStopThreads, однако это тоже не помогло.   -  person Dan    schedule 22.02.2017
comment
помимо советов по настройке, каким был ваш тестовый пример? Вы правильно вызывали параллельные запросы?   -  person AntJavaDev    schedule 23.02.2017
comment
@AntJavaDev - я обновил свой исходный вопрос информацией о вариантах использования.   -  person Dan    schedule 23.02.2017
comment
не могу увидеть ни одного поста с вашим кодом/вариантом использования, только то, что вы звоните исполнителю (!?!). Вы уверены, что вызываете его правильно, или вы используете : Executors.newSingleThreadExecutor()?   -  person AntJavaDev    schedule 23.02.2017


Ответы (1)


Настройка startStopThreads не будет иметь никакого эффекта. Он используется каждым контейнером в Tomcat (Service, Host, Context и т. д.) при запуске своих дочерних элементов. Если доступно более одного потока, контейнер с несколькими дочерними элементами будет запускать их параллельно. Это не будет иметь никакого эффекта в типичном приложении Spring Boot, поскольку каждый контейнер Tomcat имеет только один дочерний элемент.

Вместо того, чтобы пытаться использовать потоки Tomcat для параллельной инициализации, я бы рекомендовал использовать Java Executor или Spring Framework TaskExecutor.

person Andy Wilkinson    schedule 22.02.2017
comment
Я использовал вызываемые задачи Executors.newFixedThreadPool и submited, однако они выполняются только в потоке local-startStop-1 и ТОЛЬКО в этом потоке. - person Dan; 23.02.2017
comment
Извините, но на самом деле это ничего мне не говорит, и это действительно отдельный вопрос/проблема для понимания того, что делает startStopThreads. Сколько потоков вы указали и какую ThreadFactory вы передали? Я думаю, что новый вопрос, показывающий ваш код, использующий исполнителя, был бы уместен здесь. - person Andy Wilkinson; 23.02.2017