Блок планировщика задач Spring Integrations — все потоки в Task Executor заняты

Если все потоки в taskExecutor заняты (Все 100 из них). Будут ли потоки, используемые опросчиком, блокироваться? Или поток опроса оставит сообщение в очереди и повторит попытку еще через 300 мс?

<int:channel id="tasksIn">
    <int:queue capacity="50"/>    
</int:channel>

<int:bridge input-channel="tasksIn" output-channel="taskProcessing" >
    <int:poller fixed-rate="300" max-messages-per-poll="2" />
</int:bridge>

<int:channel id="taskProcessing">
    <int:dispatcher task-executor="executor"/>
</int:channel>

<service-activator input-channel="taskProcessing" output-channel="taskCompleteChannel" ref="taskProcessor" method="processTask"/>

<task:executor id="executor" pool-size="100" />

person Michael Freeman    schedule 28.09.2014    source источник


Ответы (1)


Поведение зависит от атрибута queue-capacity исполнителя задачи и его политики отклонения.

По умолчанию очередь не ограничена, поэтому задачи будут стоять в очереди до тех пор, пока у вас не закончится память.

Когда имеется ограниченный размер очереди, нет доступных потоков и очередь заполнена, политика по умолчанию должна выдавать исключение (политика отклонения по умолчанию — прерывание). Вы можете установить политику отклонения на CALLER_RUNS, и в этом случае задача будет выполняться в потоке опроса.

Spring Integration предоставляет CallerBlocksPolicy (требуется емкость очереди> 0), но пространство имен задач не поддерживает настраиваемые политики, вам нужно будет определить исполнителя как <bean/>.

Для большей сложности вы можете применить рекомендацию опросчику. и "пропускать" опросы при выбранных вами условиях. Как видно из этой ссылки, мы планируем предоставить стандартный совет в ближайшем будущем.

person Gary Russell    schedule 28.09.2014
comment
Спасибо, Гэри, это проясняет мое понимание. Применяется ли такое же поведение к исполнителям задач, определенным в опросчике? В этом случае опросчик передает исполнителю задачи выполнение опроса? Или исполняющая задача выполняет опрос? - person Michael Freeman; 30.09.2014
comment
Поллер — это поток планировщика (из bean-компонента taskScheduler). Если вы не предоставляете исполнителя задачи, мы используем SyncTaskExecutor, поэтому опрос выполняется непосредственно в потоке планировщика. Если вы указываете исполнителя задачи, опрос передается ему, поэтому, чтобы пропустить опрос с помощью совета, вам понадобится политика CALLER_RUNS. - person Gary Russell; 30.09.2014