Как можно использовать 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: размер} &ы; = изменена блокировка чтение". Но верблюд игнорирует файл.
Когда я использую TRACE для ведения журнала, он говорит: "Пропуск как файл уже выполняется...", но я не нашел файл блокировки в каталоге D:/Production при редактировании и сохранении файла.
Я также проверил, что верблюд все еще игнорирует файл, если я заменю A.log(с таким же именем, но большим размером) в каталоге D:/Production снаружи.
Но я обнаружил, что все работает как ожидалось, если я удалю noop = true option.
Я что-то пропустил?