Как заблокировать запись файла, чтобы другой потребитель не мог потреблять
Я работаю над заменой данных в файле (это большой файл размером 400 МБ) с помощью верблюда, и я сталкиваюсь с проблемой, когда файл другого потребительского пикапа используется, даже если файл используется (он находится в режиме записи).
Есть ли способ в Camel для блокировки файла, который находится в режиме записи, чтобы другой потребитель / маршрут не мог потреблять. Это должно потреблять, как только запись сделана. Я пытался с readLocks, но пока не повезло.
from("file://A").split().tokenize("\n", 999).streaming()
.log("Spliting::::::::::").unmarshal(csv).bean("transferDate", "enrich")
.marshal(csv).to("file://B?fileExist=Append");
from("file://B?delete=true").to("file://A"); // this route pick up file even the first route haven't finished writing file completely
2 ответа
Вам следует настроить маршрут Camel с соответствующими параметрами для чтения и записи файлов. В частности, вам необходимо установить параметры readLock и readLockTimeout для конечной точки файла.
from("file:/input-directory")
.routeId("fileRoute")
.to("file:/output-directory?readLock=changed&readLockTimeout=5000")
.log("File processed: ${file:name}")
.end();
Вы можете использовать готовые файлы. Если вы настраиваете их в приемнике файлов, он игнорирует все файлы до тех пор, пока рядом с реальным файлом не окажется готовый файл (или маркер).
Вы также можете настроить производителя файлов для создания готовых файлов.
Посмотрите компонент Camel Docs for File и перейдите к главе Using done files
,