【发布时间】:2012-09-25 20:38:57
【问题描述】:
我编写了一个 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 内的服务器的连接,因此当交换到达后处理器和文件端点时,将无法再访问它。
所以基本上我需要一些方法来保持连接打开,直到文件被写入并从路由定义中关闭组件内部的服务器连接,这听起来很不整洁,所以我愿意接受替代方法。
【问题讨论】:
-
是否需要每次都关闭连接,例如在路线的尽头?如果您保持连接打开,则 step2 将重用以前的连接(如果它仍然连接)。所以你可以设置disconnect=false。
-
@Claus - 目标服务器上的资源使用是一个问题,因此我需要确保正确清理连接,因此是当前的实现。如果我在第 2 步保持连接打开,是否有任何方法确保在路线完成其工作后关闭它,即在第 3 步或第 4 步之后?
-
您需要扩展camel ftp组件(例如生产者)并将会话关闭逻辑移动到交换完成时,例如我认为我们在邮件组件中做了一些类似的事情,检查邮件消费者。然后在交换完成时执行该逻辑,例如在第 4 步之后。
标签: sftp apache-camel jsch