Spring Integration SftpStreamingMessageSource не закрывает сеанс, когда возникает исключение во время чтения файла - PullRequest
0 голосов
/ 30 октября 2019

Я использую 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.

Заранее спасибо

...