Apache camel: остановить обмен от удаления = true - PullRequest
0 голосов
/ 05 октября 2018

Я хочу разрешить удаление только неповторяющихся файлов из исходного каталога.У меня есть маршрут с идемпотентным потребителем, такой как:

File repo = new File("repo.txt");
IdempotentRepository fr = FileIdempotentRepository.fileIdempotentRepository(repo);

from("sftp:someServer:somePort/someDir?delete=true")
    .idempotentConsumer(header("CamelFileName"),fr)
    .to("file:output");

В этом случае delete = true приведет к тому, что маршрут удалит также дублирующиеся сообщения из исходного каталога. Чтобы предотвратить это, я попробовалследующий код:

File repo = new File("repo.txt");
IdempotentRepository fr = FileIdempotentRepository.fileIdempotentRepository(repo);

from("sftp:someServer:somePort/someDir?delete=true")
    .idempotentConsumer(header("CamelFileName"),fr)
    .skipDuplicate(false)
    .filter(exchangeProperty(Exchange.DUPLICATE_MESSAGE).isEqualTo(true))
        .process(new Processor() {
            @Override
            public void process(Exchange exchange) throws Exception {
                exchange.setException(new InterruptedException("Cancel Exchange"));
                exchange.setProperty(Exchange.ROUTE_STOP, Boolean.TRUE);
            }
         })
    .end()
.to("file:output");

Поскольку удаление из sftp внутри маршрута потребует другого экземпляра jsch, я бы предпочел использовать свойство delete для потребителя sftp

1 Ответ

0 голосов
/ 05 октября 2018

Я могу ошибаться, но delete = true, вызывая удаление обработанных сообщений, а не дублирование. Вы настраиваете идемпотентное репо внутри маршрута, но необходимо настроить потребителя sftp с идемпотентным репо.После этого потребитель прекратит потребление и удаление уже обработанных файлов, если они снова появятся в папке.Как это:

from("sftp:someServer:somePort/someDir?delete=true&idempotent=true&idempotentRepository=#yourRepo")
...