0

I've written a Camel (2.10) component to do Sftp as I needed a bit more control over the connection than the out of the box component offers.

I have route that looks something like this:

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

This all works perfectly well.

My problem is at step 2, at the moment my files are quite small and I buffer them into memory, add the byte array to the Exchange body and its passed along and processed until it gets written by the file endpoint.

Of course this wont be sustainable with a large file, I need to add the InputStream reference to the exchange instead. My problem is I close and clean up the connection to the server inside myCustomSftpComp so when the exchange gets to post processor and file endpoint, it can no longer be accessed.

So basically I need some way to keep the connection open until after the file is written and closing the server connection inside the component from the route definition, sounds untidy so I'm open to atlernative ways of doing this.

4

1 に答える 1

0

通常の FTP コンポーネントはすぐに SFTP を処理できるため、独自の SFTP コンポーネントを作成した理由がわかりません。

ステップ 3 でなんらかの処理を行う場合、入力ストリームだけを渡すと、メモリ内のコンテンツを渡す必要があります。特に、InputStream は 1 回しか読み取れないため、これは問題になります (ただし、StreamCaching を有効にすることはできますが、メモリを消費します)。

FTP コンポーネントができることは、ファイルをディスク上の一時ファイルにローカルにダウンロードすることです。次に、ファイル ハンドルをそれに渡します。その 1 つから、Streams を簡単に取得して、それを処理したり、完了したら新しいファイルに書き込んだりすることができます。

これをチェックしてください: http://camel.apache.org/ftp2.html#FTP2-UsingLocalWorkDirectory

于 2012-09-25T21:08:58.723 に答える