Как можно использовать Apache Camel для мониторинга изменений файлов?

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

Ури вроде:

file:/some/directory

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

Ури вроде:

file:/some/directory?noop=true

потребляет каждый файл один раз, когда он добавлен или когда маршрут запущен.

Удивительно, что нет опции по строкам

consumeOnChange=true

Есть ли простой способ отслеживать изменения файлов и не удалять файл после потребления?

Ответ 1

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

Подробнее см. в документации к файлу Camel по адресу: http://camel.apache.org/file2

См. раздел Избегание чтения одного и того же файла более одного раза (идемпотентный потребитель). И читайте об idempotent и idempotentKey.

Итак, что-то похожее

from("file:/somedir?noop=true&idempotentKey=${file:name}-${file:size}")

или

from("file:/somedir?noop=true&idempotentKey=${file:name}-${file:modified}")

Здесь вы можете прочитать о различных токенах ${file: xxx}, которые вы можете использовать: http://camel.apache.org/file-language.html

Ответ 2

Я не думаю, что Camel поддерживает эту специфическую функцию, но с существующими параметрами вы можете найти аналогичное решение для мониторинга каталога.

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

Возможно, вы могли бы использовать другие решения, отличные от Camel, такие как Apache Commons VFS2 (я написал объяснение о том, как использовать его для этого сценария: WatchService блокирует некоторые файлы?

Ответ 3

Я столкнулся с той же проблемой, то есть хотел скопировать также обновленные файлы (вместе с новыми файлами). Ниже приведена моя конфигурация,

public static void main(String[] a) throws Exception {

    CamelContext cc = new DefaultCamelContext();

    cc.addRoutes(createRouteBuilder());

    cc.start();

    Thread.sleep(10 * 60 * 1000);

    cc.stop();
}


protected static RouteBuilder createRouteBuilder() {
    return new RouteBuilder() {
        public void configure() {
            from("file://D:/Production"
                    + "?idempotent=true"
                    + "&idempotentKey=${file:name}-${file:size}"
                    + "&include=.*.log"
                    + "&noop=true"
                    + "&readLock=changed")

            .to("file://D:/LogRepository");
        }
    };
}

Мои этапы тестирования:

  • Запустите программу и копирует несколько файлов .log из D:/Production в D:/LogRepository, а затем продолжает опрос D:/Production directory
  • Я открыл уже скопированный журнал, скажем, A.log из D:/Production (поскольку noop = true ничего не перемещается) и отредактировал его с помощью некоторого инструмента редактора. Это удвоило размер файла и сохранит его.

В этот момент я думаю, что Camel должен снова копировать этот файл, так как его размер изменен, и в определении маршрута я использовал " idempotent = true & idempotentKey = ${file: name} - ${file: размер} &ampы; = изменена блокировка чтение". Но верблюд игнорирует файл. Когда я использую TRACE для ведения журнала, он говорит: "Пропуск как файл уже выполняется...", но я не нашел файл блокировки в каталоге D:/Production при редактировании и сохранении файла.

Я также проверил, что верблюд все еще игнорирует файл, если я заменю A.log(с таким же именем, но большим размером) в каталоге D:/Production снаружи.

Но я обнаружил, что все работает как ожидалось, если я удалю noop = true option.

Я что-то пропустил?