我正在处理与通过camel-ftp组件下载大型文件相关的要求。 路线定义如下:
from("sftp://host:22?connectTimeout=30000&username=xxx&password=yyyy&localWorkDirectory=D:/templocation") .to("file:///D:/mylocation");
我正在寻找以下问题的答案。
如果服务器断开连接,Camel SFPT是否支持恢复功能。我观察到.inprogress文件 从底层JSCH库抛出SocketTimeout / IOException异常后删除。我的期望是骆驼应该重新建立 连接一旦可用并从它离开的位置继续下载。
connectTimeout,timeout和soTimeout等参数无效。在Windows平台(WIN 7)中,如果服务器保持断开状态 大约21秒,Camel删除了.inprogress文件。是否必须设置camel FTP组件中的任何其他参数 控制消费者超时。问题是如果文件大小非常大(1 GB或更多),并且服务器在更多时断开连接 下载了90%。
在这方面的任何帮助将受到高度赞赏。
答案 0 :(得分:0)
@ClausIbsen: 非常感谢你的回答。我非常感谢您对第2点的反馈。
我通过Camel FTP组件源代码找到了SftpOperations.retrieveFileToFileInLocalWorkDirectory 是实现与从JSch库检索数据相关的功能的方法。
代码是这样的,从底层库收到的任何异常都会导致.inprogress文件被删除 我,e channel.get(remoteName,os);.我调查了JSch库,他们可以选择简历:
get(String src, OutputStream dst, SftpProgressMonitor monitor, int mode, long skip)
Downloads a file to an OutputStream.
我通过跟踪是否存在任何.inprogress文件,将此API合并到retrieveFileToFileInLocalWorkDirectory方法中 如果存在,它的文件大小。
if(fileSize>0)
{
channel.get(remoteName, os, progressMonitor, ChannelSftp.RESUME, fileSize );
}
else
{
channel.get(remoteName, os, progressMonitor);
}
ProgressMonitor实现帮助我跟踪下载是否完成。
fileSize=temp.length();
boolean isFileDownloadComplete=(fileSize==progressMonitor.getMax());
if(isFileDownloadComplete)
rename and move the file.
通过上述实现并注释掉原始文件删除行为,下载恢复功能正常工作。 即使服务器断开连接,我也可以恢复文件下载。
我在这里有一个问题: 您是否预见到上述解决方案中存在任何实施缺陷。 是否有任何功能会受到影响我错过了。 我非常感谢您的反馈。