Apache Camel ftp consumer загружает одни и те же файлы снова и снова
У меня есть следующая весенняя конфигурация
<?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 папки с файлами, которые я хочу загрузить. Я хочу достичь следующего сценария:
- на ftp фиксируется количество файлов (для isntance 5) при первом же вытягивании данных потребитель загружает эти файлы в папку назначения
- при второй попытке загрузить файлы состояние ftp остается прежним (5 файлов), а потребитель ftp camel просто ничего не делает (кроме проверки на наличие новых файлы)
- на ftp поступают новые 2 файла, и при этом данные pull consumer скачивает только эти новые два файла
в момент, когда мои текущие решения загружают все файлы каждый раз, когда я запускаю процесс dataload, как я могу управлять информацией о загруженных файлах, чтобы предотвратить загрузку дубликатов (я имею в виду уже скопированные файлы с ftp), я могу написать свой собственный фильтр, который отфильтрует уже загруженные файлы, но я верю, что должна быть встроенная функция, которая даст я контролирую это (может быть, idempotentRepository, на самом деле я не уверен)...
3 ответов
вам нужно использовать постоянный идемпотентный репозиторий, если вы хотите, чтобы Camel мог помнить, какие файлы он ранее загрузил, между перезапусками.
вам нужно установить этот параметр на конечной точке ftp: idempotentRepository
Подробнее см. здесь:http://camel.apache.org/file2 (Примечание: компонент FTP наследует параметры из компонента file.)
на странице wiki есть несколько примеров использования различных магазинов. И вы также можете построить вам пользовательский магазин.
наконец, я получаю следующее решение:
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");
}
}
возможно, @endryha ответ хорошо работает в 2011 году, но не с Camel 2.20.1
в Camel 2.20.1 этот код создаст два idempotentRepository
- ftp памяти по умолчанию idempotentRepository
- idempotentconsumer пользовательский idempotentRepository (файл, основанный в этом случае)
таким образом, правильный способ использования idempotentRepository (я удаляю большинство параметров для удобочитаемости)
"ftp://login@url_to_ftp/RootFolder?&idempotent=true&idempotentRepository=#myIdempotentRepo"
и Боб
@Bean
private IdempotentRepository<String> myIdempotentRepo() {
return FileIdempotentRepository.fileIdempotentRepository(new File("data", "repo.dat");
}