Я использую Spring SftpStreamingMessageSource для чтения файла с сервера sftp. Файл, который я опрашиваю, заменяется новой версией с тем же именем из апстрима каждые три минуты. Тем не менее, я настроил входящий адаптер, чтобы получать каждые 10 секунд, чтобы минимизировать задержку.
В большинстве случаев работает нормально. Однако, когда опрос происходит во время замены файла, базовый класс com.jcraft.jsch.ChannelSftp
выбрасывает IOException
с основной причиной (файл не найден). Такое поведение ожидается;однако в этом случае сеанс с сервером sftp не закрывается, в результате чего соединение остается открытым для сервера. Когда это происходит несколько раз, SFTP-сервер отклоняет больше соединений, вызывая сбой последующего опроса. Я отследил это до приведенной ниже базы кода в методе AbstractRemoteFileStreamingMessageSource.doRecive()
и добавил код, чтобы закрыть соединение, когда это произойдет.
@Override
protected Object doReceive() {
AbstractFileInfo<F> file = poll();
if (file != null) {
String remotePath = remotePath(file);
Session<?> session = this.remoteFileTemplate.getSession();
try {
return getMessageBuilderFactory()
.withPayload(session.readRaw(remotePath))
.setHeader(IntegrationMessageHeaderAccessor.CLOSEABLE_RESOURCE, session)
.setHeader(FileHeaders.REMOTE_DIRECTORY, file.getRemoteDirectory())
.setHeader(FileHeaders.REMOTE_FILE, file.getFilename())
.setHeader(FileHeaders.REMOTE_FILE_INFO,
this.fileInfoJson ? file.toJson() : file);
}
catch (IOException e) {
// start -- my code change
IOUtils.closeQuietly(session);
// end-- my code change
throw new MessagingException("IOException when retrieving " + remotePath, e);
}
}
return null;
}
Это действительно баг весной? Если нет, есть ли лучший способ справиться с этим? Я использую spring -gration-file-5.0.4.
Заранее спасибо