私は最近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を事前に入力してください。
私は前に 'apache-camel'を使っていませんでしたが、スレッドがキュー内のファイル名をデキューできるように、何らかの種類のブロッキングキューを使用することは可能です。これにより、1つのスレッドが1つのファイルでのみ動作することが保証されます。 – CKing
これはこの問題を解決する可能性があります。私たちはラクダを選択しました。なぜなら、それは非常に柔軟性があり、多くの設定オプションがあり、非常に使いやすいからです。 私はキューに精通していませんが、プロジェクトがまだ起動段階にある場合は、それを選択肢と考えています。 –