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=*******&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 camel просто ничего не делает (кроме проверки на наличие новых файлы)
  3. на 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

  1. ftp памяти по умолчанию idempotentRepository
  2. 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");
}