Apache Camel ftp使用者一次又一次地加载相同的文件

时间:2011-04-18 20:20:52

标签: java ftp apache-camel

我有以下弹簧配置

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="
       http://www.springframework.org/schema/beans 
       http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
       http://camel.apache.org/schema/spring 
       http://camel.apache.org/schema/spring/camel-spring.xsd">

    <bean id="downloadLogger" class="com.thomsonreuters.oa.sdi.camel.DownloadLogger" />

    <bean id="fileFilter" class="com.thomsonreuters.oa.sdi.camel.IgnoreReadyFilesFilter" />

    <camelContext xmlns="http://camel.apache.org/schema/spring">
        <route>
            <from uri="ftp://url_to_ftp?password=*******&amp;noop=true&amp;stepwise=false&amp;binary=true&amp;consumer.delay=10s&amp;recursive=true&amp;filter=#fileFilter" />
            <process ref="downloadLogger" />
            <to uri="file:data/outbox" />
        </route>
    </camelContext>

</beans>

在ftp端,我有3个文件夹,包含我要下载的文件。我想实现以下场景:

  1. 在ftp上,第一个数据拉消费者将固定数量的文件(对于isntance 5)加载到目标文件夹
  2. 在第二次尝试加载文件时,ftp状态仍然相同(5个文件)和驼峰ftp消费者什么都不做(除了检查新文件)
  3. 要ftp到达新的2个文件,并且此数据拉消费者只下载这些新的两个文件
  4. 目前我的当前解决方案每次运行dataload进程时都会下载所有文件,我如何管理有关下载文件的信息以防止重复下载(我的意思是已经从ftp复制了文件),我可以编写自己的过滤器将过滤掉已经下载的文件,但我相信应该有内置功能,这将给我控制这个(也许是idempotentRepository,实际上我不确定)......

3 个答案:

答案 0 :(得分:12)

如果希望Camel能够记住以前在重新启动之间下载了哪些文件,则需要使用持久性幂等存储库。

您需要在ftp端点上设置此选项:idempotentRepository

在此处查看更多详情:http://camel.apache.org/file2 (注意:FTP组件从文件组件继承选项。)

维基页面上有一些示例如何使用不同的商店。您还可以构建自定义商店。

答案 1 :(得分:4)

最后,我最终得到了以下解决方案:

public class SdiRouteBuilder extends RouteBuilder {
    @Override
    public void configure() throws Exception {
        from("ftp://login@url_to_ftp/RootFolder?" +
                "password=******&noop=true&stepwise=false&binary=true&consumer.delay=10s&recursive=true&filter=#fileFilter")
                .idempotentConsumer(header("CamelFileName"), FileIdempotentRepository.fileIdempotentRepository(new File("data", "repo.dat")))
                .process(new DownloadLogger())
                .to("file:data/outbox");
    }
}

答案 2 :(得分:1)

也许@endryha回答在2011年运作良好,但不适用于Camel 2.20.1

在Camel 2.20.1中,这些代码将创建两个idempotentRepository

  1. ftp默认内存idempotentRepository
  2. idempotentConsumer自定义idempotentRepository(在这种情况下基于文件)
  3. 因此,使用idempotentRepository的正确方法是(我删除了大多数参数以便于阅读)

    "ftp://login@url_to_ftp/RootFolder?&idempotent=true&idempotentRepository=#myIdempotentRepo"
    

    和一个Bean

    @Bean
    private IdempotentRepository<String> myIdempotentRepo() {
        return FileIdempotentRepository.fileIdempotentRepository(new File("data", "repo.dat");
    }