#apache-camel #hazelcast #spring-camel #idempotent #camel-ftp
Вопрос:
Я использую HazelcastIdempotentRepository, чтобы избежать дублирования обработки сообщений при работе двух узлов. Я использовал удалить=true в параметр запроса в URI, чтобы удалить файлы после их обработки, узел 1 и узел 2 экземплярах сходятся в одном удаленном месте, скажем, узел-1 экземпляр потреблял файл с удаленного SFTP, и местоположение, и он удалил файл после обработки, теперь узел-2 экземпляра тоже пытаешься удалить файл и узел-1 экземпляр будет уже удален из-за чего узел-2 экземпляра бросает GenericFileOperationFailedException — не удается удалить файл: демо/Sanity_JSONDev/копия 2 MassAdditions.xlsx]
Если я удалю delete=true в URI From, это будет работать нормально, так как оба экземпляра узла не удалят файл, но требование требует удалить файлы после обработки
Попробовал переместить=.сделано эта опция также не будет работать для меня, так как оба экземпляра узла попытаются переместить файлы после обработки, либо экземпляр узла выдаст исключение GenericFileOperationFailedException — Не удается динамически переименовать файл в Demo/Sanity_JSONDev/.сделано/Копия 2 MassAdditions.xlsx].
Требование: Когда экземпляр Node-1 использует файл из удаленного местоположения sftp, он должен удалить файл из удаленного местоположения, если экземпляр Node-1 удалил файл, то экземпляр Node-2 не должен пытаться удалить файл снова. Таким образом, мы не получим никаких исключений.
Пожалуйста, дайте мне знать, если есть какие-либо обходные пути для моего требования.
Маршрут:
from("sftp://{{host_address}}/Demo/ORA_AST_IN?username={{username}}amp;password={{password}}amp;readLock=changedamp;readLockMinAge=30samp;fastExistsCheck=trueamp;delete=trueamp;recursive=trueamp;useUserKnownHostsFile=false") .routeId(this.getId()) .idempotentConsumer(simple("${file:name}-${file:modified}-${file:size}"), repository) .skipDuplicate(true) .doTry() .setProperty(........) .setProperty(.........) .threads(10) .log(LoggingLevel.INFO, logger, "Processing From URI " this.getFromUri()) .to("direct:processIncomingFile") .endDoTry() .doCatch(Exception.class) .to(this.getExceptionsRouteName()) .end() .end();