我正在使用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。
预先感谢