2015-08-20 3 views
0

У меня есть веб-сервиса, который, в свою очередь, вызывает 10 других WebServices и это приводит к более высокой реакции times.So я использую ExecutorService, чтобы порождать темы, созданные весной servlet.xml конфигурации, как показано ниженити Применение в котом 7

<bean id="executorService" class="org.springframework.scheduling.concurrent.ThreadPoolExecutorFactoryBean" scope="prototype"> 
    <property name="corePoolSize" value="3" /> 
    <property name="maxPoolSize" value="4" /> 
    <property name="keepAliveSeconds" value="5" /> 
</bean> 

Я отслеживаю потоки в JvisualVM и замечаю, что существует 3 потока исполнительных сервисов во все времена. Я пытаюсь понять, если это будет вращать 3 потока для каждого запроса, который приходит или все запросы попытаются использовать те же 3 corePoolSize, которые настроены.

Если все запросы, поступившие в продажу, собираются использовать 3 потока, необходимо увеличить размер основного пула (если да, то к какому числу)?

Также, когда я должен закрыть службу исполнителя?

Я новичок в прядильных нитках таким образом, может кто-нибудь помочь мне понять, как это работает?

+0

Какова цель откручивания резьбы? Вы пытаетесь выполнить 10 вызовов webservice параллельно? Если да, то зачем создавать пул размером 3-4? – Andreas

+0

Да, он должен запускать 10 запросов webservice параллельно. Мне было интересно посмотреть, работает ли оно на 3-4, а затем набирает обороты. – remo

ответ

2

Бобы весной являются одиночными, по умолчанию, поэтому у вас есть только один экземпляр executorService, который управляет пулом потоков размером 3-4.

Когда пул создан, он запустит 3 потока, которые затем простаивают до тех пор, пока это не понадобится. Если требуется больше потоков, он будет использовать не более 4 потоков, поэтому только на 1 больше, чем изначально созданных.

Это независимо от того, сколько входящих запросов пытается использовать пул.

+0

Мне нужно обслуживать, скажем 100 запросов. Какое может быть максимальное значение, которое я могу установить для corePoolSize. Кроме того, я указал область действия в качестве прототипа, будет ли она создавать одноэлемент? – remo

+0

Максимальное значение контролируется ресурсами, доступными на вашем сервере. Является ли ваш веб-сервис bean также прототипом. Наверное, нет, но это не имеет значения. Создайте пул небольшой (core = 0), с возможностью расти по мере необходимости (max = 100). Если вы получаете 3 входящих запроса, каждый из которых запускает 10 потоков, пул будет расти до 30. Когда 30 запросов будут завершены, потоки будут оставаться бездействующими для keepAliveSeconds и затем будут остановлены. – Andreas

+0

ОК получил вас, Если мы не создадим bean для executorservice, вместо этого мы создадим экземпляр для каждого запроса, будем keepAliveSeconds, скажем 500 мс .. будет ли это жизнеспособным подходом? – remo

1

Как упоминалось в @andreas, у вас будет один экземпляр службы executorservice, поскольку определение bean-компонента по умолчанию является singleton.

doc говорит, corePoolSize - количество потоков, которые нужно хранить в пуле, даже если они простаивают, если не установлен параметр allowCoreThreadTimeOut. Таким образом, вы всегда будете иметь три потока в пуле, хотя они живы. Если количество запросов больше, размер пула увеличится до 4, потому что вы установили maxPoolSize в 4. Но четвертый поток (вы не знаете, какой из них) будет выходить из пула после простоя в течение 5 секунд, потому что вы установили keepAliveTime до 5.

Чтобы ответить на более позднюю часть вашего вопроса, вы можете посмотреть мой ответ на аналогичный вопрос here. Это проблема настройки производительности и зависит от того, как ваше приложение обрабатывает операции ввода-вывода, CPU и т. Д.

Как вы уже сказали, вы звоните в 10 других веб-сервисов для одного входящего запроса, поэтому один запрос разворачивается 10 запросов. Связаны ли они с привязкой к сети ввода/вывода или ЦП? Как вы их объединяете? Сколько конфликтов ресурсов существует при объединении ответов от 10 нисходящих служб?

Смежные вопросы