Spring Integration - Если Poller и TaskExecutor не настроены, происходит утечка памяти
В нижеприведенном разделе 7.1.7 "Асинхронный опрос" документа Spring Integration утечка памяти может произойти, если Poller и TaskExecutor не настроены. Но я этого не понял.
<int:service-activator input-channel="publishChannel" ref="myService">
<int:poller receive-timeout="5000" task-executor="taskExecutor" fixed-rate="50"/>
</int:service-activator>
<task:executor id="taskExecutor" pool-size="20" queue-capacity="20"/>
Приведенная выше конфигурация демонстрирует одну из тех конфигураций, которые не соответствуют настройке.
Программа опроса продолжает планировать новые задачи, даже если все потоки заблокированы, ожидая прибытия нового сообщения или истечения времени ожидания. Учитывая, что есть 20 потоков, выполняющих задачи с тайм-аутом в 5 секунд, они будут выполняться со скоростью 4 в секунду (5000/20 = 250 мс). Но новые задачи планируются со скоростью 20 в секунду, поэтому внутренняя очередь в исполнителе задач будет расти со скоростью 16 в секунду (пока процесс простаивает), поэтому мы, по сути, имеем утечку памяти.
Один из способов справиться с этим - установить для атрибута емкости очереди> Task Executor значение 0.
Может кто-нибудь, пожалуйста, разработайте это.
Вот мое понимание приведенного выше кода:
размер пула равен 20, поэтому будет выполнено 20 потоков.
Тайм-аут получения составляет 5 секунд. Таким образом, 20 нитям будет предоставлено 5 секунд для выполнения задач.
фиксированная скорость составляет 50 мс - поэтому новые задачи планируются со скоростью 20 в секунду.
У меня есть несколько вопросов:
В. Что произойдет, если выполнение 20 потоков займет более 5 секунд?
Q. В документе указанные задачи будут выполняться со скоростью 4 в секунду. Но некоторые задачи могут выполняться менее чем за 4 секунды, а некоторые занимают больше времени.
В. Как это вызывает утечку памяти? Если нет доступных потоков и очередей, Исполнитель отклоняет их согласно политике отклонения.
Q. Как установка емкости очереди в 0 помогает здесь? Насколько я понимаю, если все потоки заняты, то Executor поместит их в очередь, пока не достигнет емкости очереди.
1 ответ
Документация неверна - утечка памяти возможна только в том случае, если у вас неограниченная очередь и обработка сообщений не может идти в ногу. Я открыл проблему JIRA, чтобы исправить это.