与大文件传输相关的Camel FTP问题

时间:2015-06-25 10:28:51

标签: apache-camel

我正在处理与通过camel-ftp组件下载大型文件相关的要求。 路线定义如下:

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

我正在寻找以下问题的答案。

  1. 如果服务器断开连接,Camel SFPT是否支持恢复功能。我观察到.inprogress文件 从底层JSCH库抛出SocketTimeout / IOException异常后删除。我的期望是骆驼应该重新建立 连接一旦可用并从它离开的位置继续下载。

  2. connectTimeout,timeout和soTimeout等参数无效。在Windows平台(WIN 7)中,如果服务器保持断开状态 大约21秒,Camel删除了.inprogress文件。是否必须设置camel FTP组件中的任何其他参数 控制消费者超时。问题是如果文件大小非常大(1 GB或更多),并且服务器在更多时断开连接 下载了90%。

  3. 在这方面的任何帮助将受到高度赞赏。

1 个答案:

答案 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.

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

我在这里有一个问题: 您是否预见到上述解决方案中存在任何实施缺陷。 是否有任何功能会受到影响我错过了。 我非常感谢您的反馈。