2015-06-25 33 views
1

我正在处理与通过骆驼-ftp组件下载大文件相关的需求。 路线定义如下:有关大文件传输的骆驼FTP问题

 
from("sftp://host:22?connectTimeout=30000&username=xxx&password=yyyy&localWorkDirectory=D:/templocation") 
.to("file:///D:/mylocation"); 

我要寻找的答案,下面的问题。

  1. 不骆驼SFPT支持恢复功能的情况下,有disconnect.I观察到,.inprogress文件 被删除一次了socketTimeout/IOException异常异常是从JSCH库底层抛出的服务器。我的期望是,骆驼应该在连接可用时重新建立 ,并从其离开的位置继续下载。

  2. 诸如connectTimeout,timeout和soTimeout之类的参数不起作用。在Windows平台(WIN 7)中,如果服务器在大约21秒内保持断开状态,则Camel将删除.inprogress文件。在骆驼FTP组件中是否有任何其他参数必须设置为 来控制使用者超时。问题是如果文件大小非常大(1 GB或更多),并且在下载了90%以上的文件时服务器断开连接。

在这方面的任何帮助将不胜感激。

+0

对于数字1,则答案为否 –

回答

0

@ClausIbsen: 非常感谢您的回答。我真的很感激你对第2点的反馈。

我经历了Camel FTP组件源代码,发现SftpOperations.retrieveFileToFileInLocalWorkDirectory是与从JSch库检索数据相关的功能实现的方法。

代码是这样的,从底层库接收到的任何异常都会导致.inprogress文件被删除 i,e channel.get(remoteName,os);.我调查JSch库,他们有恢复的选项:

get(String src, OutputStream dst, SftpProgressMonitor monitor, int mode, long skip) 
Downloads a file to an OutputStream. 

我通过跟踪,如果有任何.inprogress文件 纳入retrieveFileToFileInLocalWorkDirectory方法这个API,如果存在,它的文件大小。

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. 

通过以上实现并注释掉原始文件删除行为,下载恢复功能正在工作。 即使服务器断开连接,我也可以恢复文件下载。

我在这里有一个问题: 您是否预见到上述解决方案中的任何实现缺陷。 是否有任何功能会受到影响,我错过了。 我真的很感激你的反馈。