NonePoll Enrich внутри цикла DoWhile удаляет только последний файл обмена
Верблюд удаляет только последний файл обмена, а не другие файлы из исходного каталога, когда в цикле loopDoWhile используется pollenrich
У меня 2 роутера, процесс и бэкап.
- После успешного выполнения роутера процесса я хочу переместить все файлы из dir1 в dir2 на s3. Поэтому я вызываю резервный маршрутизатор, устанавливая заголовок "backupFiles" в "true"
- В резервном маршрутизаторе я использую loopDoWhile и разрываю цикл, если backupFiles не равен 'true'
технологический маршрутизатор
from("some starting point")
.routeId("process")
// after successful operation, move all the files
// from directory1 to directory2 on aws s3
.setHeader("backupFiles", simple("true"))
.to("direct:backup");
резервный маршрутизатор
from("direct:backup")
.routeId("backup")
.loopDoWhile(header("backupFiles").isEqualTo("true"))
.pollEnrich()
.simple("aws://bucketprefix=
some_input_dir&deleteAfterRead=true")
.timeout(5000)
.choice()
.when(new FileBackupPredicate())
.setHeader("originalKey", header(S3Constants.KEY))
.setHeader("s3FileName", method(MoveFiles.class, "getS3FileName"))
.setHeader(S3Constants.KEY, simple("backup/" + "${in.header.s3FileName}"))
.to(s3Bucket)
.setHeader(S3Constants.KEY, "${in.header.originalKey}")
.end()
.end();
Класс FileBackupPredicate
@Override
public boolean matches(Exchange exchange) {
boolean isEnd = (boolean)
exchange.getProperty(Exchange.BATCH_COMPLETE);
if (!isEnd) {
exchange.getIn().setHeader("backupFiles", "true");
} else {
exchange.getIn().setHeader("backupFiles", "false");
}
return true;
}
Все работает нормально, копирует все файлы из dir1 в dir2, с этим проблем нет.
- Но проблема в том, что он удаляет только последний файл обмена, а не другие файлы из dir1
- Например, если в резервном маршрутизаторе dir1 есть 3 файла 1.txt, 2.txt и 3.txt, он копирует все файлы из dir1 в dir2, но удаляет только 3.txt из dir1 (не удаляет 1.txt и 2.txt от dir1) Так что я думаю, что верблюд совершает только последний обмен, поэтому он выполняет deleteAfterRead=true для него, но не для других обменов.
Могу ли я знать, что я делаю здесь неправильно или как добиться желаемых результатов?