2017-02-16 8 views
2

私は最近Camelでリモートサーバにいくつかのファイルをftpする作業を始めました。かなりの量のデータが転送される必要があります(〜5 GB)。そのデータをすばやく配信するために、私はCamelをいくつかのスレッドで動作させるように設定しました。 マイコンフィギュレーションクラスは、次のようになります:ラクダのジップ入力のApache Camel xxxミリ秒以内にロックを取得できません。ファイルをスキップします

@Component 
public class FTPCamelRoute extends SpringRouteBuilder { 

    @Value("${camel.zip.input}") 
    private String inputDirectory; 

    public void configure() { 
     from(inputDirectory + "?recursive=true&readLock=changed&readLockTimeout=3000&readLockCheckInterval=500&readLockMinAge=30s") 
      .onException(Exception.class).maximumRedeliveries(3).retryAttemptedLogLevel(LoggingLevel.WARN).continued(true).end() 
      .threads(10) 
      .log("Uploading file ${file:name}") 
      .to("{{camel.zip.output}}") 
      .log("Uploaded file ${file:name} complete."); 
    } 
} 

定義し、次のように出力フォルダを探します:

camel.zip.input=file\\:/Temp/ 
camel.zip.output=ftp://host:21?username=xxx&password=yyy&binary=true 

私のコードを実行し、すべてのファイルが転送されます。しかし、私は複数のファイルに対してreadLockタイムアウトを繰り返し続けています(処理が必要なファイルの約10%がこのタイムアウトをスローします)。私はいくつかのスレッドがすでに別のスレッドによって処理されているファイルをロックしようとしていると仮定しているため、そのファイルのreadLockタイムアウトが発生しています。しかし、これはスレッディングアプリケーションには適切な動作ではないようです。これを回避する方法はありますか?

Thnxを事前に入力してください。

+0

私は前に 'apache-camel'を使っていませんでしたが、スレッドがキュー内のファイル名をデキューできるように、何らかの種類のブロッキングキューを使用することは可能です。これにより、1つのスレッドが1つのファイルでのみ動作することが保証されます。 – CKing

+0

これはこの問題を解決する可能性があります。私たちはラクダを選択しました。なぜなら、それは非常に柔軟性があり、多くの設定オプションがあり、非常に使いやすいからです。 私はキューに精通していませんが、プロジェクトがまだ起動段階にある場合は、それを選択肢と考えています。 –

答えて

0

自分でスレッドを作成する必要はありません。別の方法で言わない限り、Camelはfrom-directory内のすべてのファイルを読み込み、別のスレッドで処理します。あなたの読み取りロックはおそらく、最初のスレッドによって既にロックされているファイルにアクセスしようとしている他のスレッドの一部またはすべてのためです。

+0

まあまあ、それも私が考えていることです。これは、他の何よりも、apache-camel自体のバグの方が多いようです。 キャメルの設定オプションを変更することで、これを簡単に回避できる方法があるかどうかは疑問です。私はロック戦略を試してみましたが、どれも問題を解決していないようです。 –

+0

私が意味するところは、ファイルコンポーネントとその派生物(例えばftpやsftp)はそれ自身でマルチスレッド化されているということです。したがって、実際にトレッドDSLを使用する必要はありません。取得している読み取りロックは、あなたがポーリングしているディレクトリにファイルを連続して書き込んでいることを示唆する独自のスレッドより前に起きていますか?ルートが排他ロックを達成できない場合、ファイルはスキップされます。これを避けるには、temp-dirにファイルを書き込んだ後、from-endpointとして使用しているディレクトリに移動してください。 – noMad17

+0

Aha! あなたはそうです。私の春バッチ処理はファイルを生成し、これらをディレクトリに書き込みます。この同じディレクトリは、私のラクダの処理の終点として使用されます。 この正確な理由から、私は30秒のreadLockMinAgeで "変更された"読み取りロックを使用しました。私の春のバッチ処理は間違いなくそのディレクトリにファイルを書き込むために必要以上に必要はありませんが、おそらく私はそこに何かを見落としている。 ラクダの処理全体に「スレッド(10)」を追加すると、FTPの処理速度が大幅に向上しました(テスト実行には、スレッドなしで行った時間の約1/3がかかりました)。 –

関連する問題