Опрашивать файлы из файловой системы только для чтения (idempotent=false) с Apache Camel?
Я использую шаблон опроса потребителей, чтобы прочитать все файлы из данного каталога, доступного только для чтения, и обработать их. Есть ли возможность игнорировать идемпотентность?
Я понимаю, что маршрут, определенный с помощью noop=true & idempotent=false, приведет к сбою всей системы (бесконечный цикл), но объединение шаблона потребителя является одноразовой операцией, которая запускается в данный момент.
2 ответа
Конечная точка верблюда file2 не приведет к сбою системы, поскольку по умолчанию она опрашивает 2 раза в секунду. Это создаст сообщение из всех файлов, которые находятся в этой папке в данный момент. (ну, есть некоторые варианты, чтобы игнорировать недавно измененные файлы, но большинство из них). например, файлы отправляются 2 раза в секунду по конвейеру.
Идемпотентность по умолчанию отключена, если не передано noop, чтобы по существу оставить файлы во входной папке. Однако каждый раз, когда конечная точка опрашивает, все файлы будут проходить через канал. Я обычно перемещаю файлы после обработки (или раньше с preMove, если у меня несколько потребителей), чтобы избежать этих дубликатов и все же избежать сложности хранения идемпотентности.
При выборе noop невозможно отключить идемпотентный флаг:
FileConsumer result = newFileConsumer(processor, operations);
if (isDelete() && getMove() != null) {
throw new IllegalArgumentException("You cannot set both delete=true and move options");
}
// if noop=true then idempotent should also be configured
if (isNoop() && !isIdempotentSet()) {
log.info("Endpoint is configured with noop=true so forcing endpoint to be idempotent as well");
setIdempotent(true);
}
в этом случае флаг идемпотента сбрасывается после создания потребителя.
Что можно сделать, это создать тривиальную реализацию IdempotentRepository ( http://camel.apache.org/maven/current/camel-core/apidocs/org/apache/camel/spi/IdempotentRepository.html), которая игнорирует все обновления и сообщает конечной точке, что он никогда не видел этот файл раньше.
package com.company;
import org.apache.camel.spi.IdempotentRepository;
public class DummyIdempotentRepository implements IdempotentRepository {
@Override
public boolean add(Object key) {
return true;
}
@Override
public boolean contains(Object key) {
return false;
}
@Override
public boolean remove(Object key) {
return true;
}
@Override
public boolean confirm(Object key) {
return true;
}
@Override
public void start() throws Exception {
}
@Override
public void stop() throws Exception {
}
}
Нечто подобное должно сделать это.
Если вы хотите прочитать файлы о конкретном событии, используйте pollEnrich
с потребителем файла:
from("direct:readFile")
.setHeader("CamelFileName", simple("${body}"))
.pollEnrich("file:///base/folder?fileName=${body}&noop=true", 500)
.process(...)