我已经写了一个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内部服务器的连接,这样当交换机到达后处理器和文件端点时,就无法再访问它了。
所以基本上我需要一些方法来保持连接打开,直到写入文件并从路由定义中关闭组件内的服务器连接,听起来不整洁,所以我愿意这样做。
答案 0 :(得分:0)
我不确定你为什么编写自己的SFTP组件,因为常规FTP组件开箱即用处理SFTP。
如果要在第3步中进行某些处理,仅传递输入流仍会让您在内存中传递内容。特别是,这将是一个问题,因为InputStream只能被读取一次(虽然可以启用StreamCaching,但是消耗内存)。
FTP组件可以做的是将文件本地下载到磁盘上的临时文件。然后传递File句柄。从那个开始,您可以轻松地让Streams使用它来完成任务,并在完成后将其写入新文件。
检查一下: http://camel.apache.org/ftp2.html#FTP2-UsingLocalWorkDirectory