Spring Integration @Scheduled не работает из-за @Poller - PullRequest
0 голосов
/ 17 марта 2020

У меня запущено приложение Spring Boot / Spring Integration, которое использует @Poller в Spring Integration, а также @Scheduled в другом методе в основном несвязанном классе. @Poller предназначен для опроса FTP-сервера на наличие новых файлов. Однако я обнаружил, что @Poller как-то мешает моему @Scheduled методу.

У @Poller есть maxMessagesPerPoll = -1, поэтому он обработает столько файлов, сколько сможет получить. Однако, когда я впервые запускаю свое приложение, на FTP-сервере находится более 100 файлов, поэтому он будет обрабатывать их все. Я обнаружил, что если эти файлы обрабатываются, то @Scheduler вообще перестает запускаться.

Например, если я установлю для @Scheduled значение fixedDelay = 1, которое будет срабатывать каждую миллисекунду и затем запустите мое приложение, метод @Scheduled будет срабатывать несколько раз, пока @Poller не сработает и не начнет обрабатывать сообщения, после чего мой метод @Scheduled полностью прекратит запуск. Я предположил, что просто была какая-то очередь задач, которая заполнялась @Poller, поэтому мне просто нужно было дождаться обработки всех сообщений, но даже после того, как @Poller полностью завершен и обработал все файлы метод @Scheduled по-прежнему не запускается вообще.

Я думаю, что, возможно, существует какая-то очередь задач, которая заполняется @Poller, что нарушает мой метод @Scheduled, но если это так, я все еще не вижу способа, которым я могу используйте отдельную очередь задач для различных методов или любые другие возможные параметры для настройки или исправления этой проблемы.

Кто-нибудь знает, что может происходить с моим @Scheduled методом и как я могу это исправить?

@Poller:

    @Bean
    @InboundChannelAdapter(channel = "ftpChannel", poller = @Poller(cron = "0/5 * * ? * *", maxMessagesPerPoll = "-1"))
    public MessageSource<InputStream> myMessageSource() {
        //Build my message source
        return messageSource;
    }

@Scheduled:

@Scheduled(fixedDelay = 6000)
public void myScheduledMethod(){
  //Do Stuff
}

1 Ответ

1 голос
/ 17 марта 2020

Они используют одно и то же имя компонента для своего планировщика. taskScheduler.

. Это может быть проблемой, только если у вас есть 10 или более обработчиков (для компонента планирования по умолчанию, настроенного в Spring Integration, размер пула равен 10 по умолчанию). Распространенной ошибкой является наличие множества каналов очереди (которые по умолчанию удерживают потоки планировщика на секунду за раз).

Если у вас есть только один опросщик, а не много каналов очереди, я могу ' Объяснить, почему вы можете получить истощение потока.

Вы можете увеличить размер пула - см. Настройка планировщика задач .

Или вы можете использовать другой планировщик в ScheduledAnnotationBeanPostProcessor.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...