当文件读取期间发生异常时,Spring Integration SftpStreamingMessageSource不会关闭会话

时间:2019-10-30 17:40:10

标签: ioexception spring-integration-sftp

我正在使用spring SftpStreamingMessageSource从sftp服务器读取文件。我轮询的文件每三分钟就会被上游的同名新版本替换。但是,我将入站适配器设置为每10秒拉动一次,以最大程度地减少延迟。

在大多数情况下,这可以正常工作。但是,如果在替换文件时进行轮询,则根本的IOException类将引发具有根本原因(找不到文件)的com.jcraft.jsch.ChannelSftp。此行为是预期的;但是,在这种情况下,与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-integration-file-5.0.4。

预先感谢

0 个答案:

没有答案