首页 > 解决方案 > Apache骆驼:停止交换继续删除=真

问题描述

我只想允许从源目录中删除非重复文件。我有一条幂等消费者的路线,如下所示:

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 实例,我希望能够使用 sftp 消费者的 delete 属性

标签: javaapache-camelesbdsl

解决方案


我可能是错的,但 delete=true 导致删除已处理的消息,而不是重复的。您在路由内配置幂等 repo,但需要使用幂等 repo 配置 sftp 使用者。之后,如果它们再次出现在文件夹中,消费者将停止消费和删除已处理的文件。像这样:

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

推荐阅读