0

我编写了一个 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 内的服务器的连接,因此当交换到达后处理器和文件端点时,将无法再访问它。

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

4

1 回答 1

0

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

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

FTP 组件可以做的是将文件本地下载到磁盘上的临时文件中。然后将文件句柄传递给它。从那个,你可以很容易地让 Streams 用它做一些事情,并在完成后将它写入一个新文件。

看看这个: http ://camel.apache.org/ftp2.html#FTP2-UsingLocalWorkDirectory

于 2012-09-25T21:08:58.723 回答