Клиент Apache Camel ftp загружает одни и те же файлы снова и снова - PullRequest
6 голосов
/ 19 апреля 2011

У меня следующая конфигурация пружины

<?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 файла, и при этом данные извлекают потребитель, загружающий только этиновые два файла

В настоящее время мои текущие решения загружают все файлы каждый раз, когда я запускаю процесс загрузки данных, как я могу управлять информацией о загруженных файлах, чтобы предотвратить загрузку дубликатов (я имею в виду уже скопированные файлы из ftp), Я могу написать свой собственный фильтр, который отфильтровывает уже загруженные файлы, но я верю, что должна быть встроенная функция, которая даст мне контроль над этим (возможно, idempotentRepository, на самом деле я не уверен) ...

Ответы [ 3 ]

12 голосов
/ 20 апреля 2011

Вам нужно использовать постоянный идемпотентный репозиторий, если вы хотите, чтобы Camel мог помнить, какие файлы он ранее скачал, между перезапусками.

Вам необходимо установить этот параметр на конечной точке ftp: idempotentRepository

Подробнее здесь: http://camel.apache.org/file2 (Примечание. Компонент FTP наследует параметров из файлового компонента.)

На вики-странице есть несколько примеров использования разных магазинов. И вы также можете построить свой собственный магазин.

4 голосов
/ 20 апреля 2011

В итоге я получаю следующее решение:

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");
    }
}
1 голос
/ 23 января 2018

Может быть, ответ @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");
}
...