我有以下弹簧配置
<?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=*******&noop=true&stepwise=false&binary=true&consumer.delay=10s&recursive=true&filter=#fileFilter" />
<process ref="downloadLogger" />
<to uri="file:data/outbox" />
</route>
</camelContext>
</beans>
在ftp端,我有3个文件夹,包含我要下载的文件。我想实现以下场景:
目前我的当前解决方案每次运行dataload进程时都会下载所有文件,我如何管理有关下载文件的信息以防止重复下载(我的意思是已经从ftp复制了文件),我可以编写自己的过滤器将过滤掉已经下载的文件,但我相信应该有内置功能,这将给我控制这个(也许是idempotentRepository,实际上我不确定)......
答案 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
因此,使用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");
}