В нашем проекте нам нужно получить цены с удаленного FTP-сервера. В рабочее время это работает нормально, цены извлекаются и успешно обрабатываются. В нерабочее время на ftp-сервере не публикуются новые цены, поэтому, как и ожидалось, мы не нашли ничего нового.
Наша проблема в том, что после нескольких часов отсутствия новых цен, опросчик просто прекращает опрос. Нет ошибок в лог-файлах (даже при работе на org.springframework.integration
на уровне отладки) и исключений. Сейчас мы используем отдельную TaskExecutor
, чтобы изолировать проблему, но все же программа опроса просто останавливается. В то же время мы скорректировали выражение cron в соответствии с этими часами, чтобы ограничить использование ресурса, но при этом опросчик просто останавливается, когда он должен работать.
Любая помощь в устранении этой проблемы очень ценится!
Мы используем @InboudChannelAdapter
для FtpStreamingMessageSource
, который настроен следующим образом:
@Bean
@InboundChannelAdapter(
value = FTP_PRICES_INBOUND,
poller = [Poller(
maxMessagesPerPoll = "\${ftp.fetch.size}",
cron = "\${ftp.poll.cron}",
taskExecutor = "ftpTaskExecutor"
)],
autoStartup = "\${ftp.fetch.enabled:false}"
)
fun ftpInboundFlow(
@Value("\${ftp.remote.prices.dir}") pricesDir: String,
@Value("\${ftp.remote.prices.file.pattern}") remoteFilePattern: String,
@Value("\${ftp.fetch.size}") fetchSize: Int,
@Value("\${ftp.fetch.enabled:false}") fetchEnabled: Boolean,
clock: Clock,
remoteFileTemplate: RemoteFileTemplate<FTPFile>,
priceParseService: PriceParseService,
ftpFilterOnlyFilesFromMaxDurationAgo: FtpFilterOnlyFilesFromMaxDurationAgo
): FtpStreamingMessageSource {
val messageSource = FtpStreamingMessageSource(remoteFileTemplate, null)
messageSource.setRemoteDirectory(pricesDir)
messageSource.maxFetchSize = fetchSize
messageSource.setFilter(
inboundFilters(
remoteFilePattern,
ftpFilterOnlyFilesFromMaxDurationAgo
)
)
return messageSource;
}
Значения свойств:
poll.cron: "*/30 * 4-20 * * MON-FRI"
fetch.size: 10
fetch.enabled: true
Мы ограничиваем опрос .cron мы использовали извлечение каждую минуту.
В соответствующем DefaultFtpSessionFactory
тайм-ауты установлены на 60 секунд, чтобы переопределить значение по умолчанию -1 (что означает отсутствие тайм-аута вообще):
sessionFactory.setDataTimeout(timeOut)
sessionFactory.setConnectTimeout(timeOut)
sessionFactory.setDefaultTimeout(timeOut)