【问题标题】:Holding Sftp connection open inside camel component and route在骆驼组件和路由内部保持 Sftp 连接打开
【发布时间】: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


【解决方案1】:

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

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

FTP 组件可以做的是将文件本地下载到磁盘上的临时文件。然后将文件句柄传递给它。通过该文件,您可以轻松地让 Streams 对其进行处理,并在完成后将其写入新文件。

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

【讨论】:

  • 为此创建自定义组件并不是一个天真的选择,我针对我的用例对 FTP/SFTP 组件进行了广泛测试,发现它们太慢了(主要是由于我的文件量很大'正在处理和轮询消费者),其次,正如我在帖子中所说,我需要对连接进行绝对控制,因为我的组件还内置了一些负载平衡策略。我将再次使用本地工作目录进行调查,看看它是否适合解决方案。
  • 当然,我确定是有原因的。正如您所说,SFTP/FTP 的行为因用例而异。无论如何,克劳斯关于将会话处理移动到交换的生命周期的回答似乎是要走的路
猜你喜欢
  • 2015-04-06
  • 2022-01-11
  • 2018-08-25
  • 2019-02-23
  • 1970-01-01
  • 1970-01-01
  • 2014-11-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多