在骆驼组件和路线内保持Sftp连接打开

时间:2012-09-25 20:38:58

标签: sftp apache-camel jsch

我已经写了一个Camel(2.10)组件来做Sftp,因为我需要对连接的控制比开箱即用组件提供的更多。

我的路线看起来像这样:

from("direct:start")
    .to(startProcessor())       //1. Start processor sets the connection parameters for myCustomSftpComp producer
    .to("myCustomSftpComp")     //2. Uses Jsch, connects to server, gets the file, add to exchange, closes connection
    .to(somePostProcessor())    //3. Does something with the file
    .to("file://....");         //4. Write the file

这一切都运作良好。

我的问题出现在第2步,目前我的文件非常小,我将它们缓冲到内存中,将字节数组添加到Exchange主体并将其传递并处理,直到它被文件端点写入。

当然,这对于大文件来说是不可持续的,我需要将InputStream引用添加到交换中。我的问题是我关闭并清理myCustomSftpComp内部服务器的连接,这样当交换机到达后处理器和文件端点时,就无法再访问它了。

所以基本上我需要一些方法来保持连接打开,直到写入文件并从路由定义中关闭组件内的服务器连接,听起来不整洁,所以我愿意这样做。

1 个答案:

答案 0 :(得分:0)

我不确定你为什么编写自己的SFTP组件,因为常规FTP组件开箱即用处理SFTP。

如果要在第3步中进行某些处理,仅传递输入流仍会让您在内存中传递内容。特别是,这将是一个问题,因为InputStream只能被读取一次(虽然可以启用StreamCaching,但是消耗内存)。

FTP组件可以做的是将文件本地下载到磁盘上的临时文件。然后传递File句柄。从那个开始,您可以轻松地让Streams使用它来完成任务,并在完成后将其写入新文件。

检查一下: http://camel.apache.org/ftp2.html#FTP2-UsingLocalWorkDirectory