Как ввести Delay in Camel, чтобы предотвратить блокировку файлов до их копирования? - PullRequest
0 голосов
/ 15 октября 2018

Я использую Camel, ActiveMq и JMS для опроса каталога и обработки любых найденных файлов.Проблема с большими файлами заключается в том, что они начинают обрабатываться перед тем, как полностью копироваться в каталог.Я предположил (да, я знаю, что вы предполагаете), что файловая система предотвратит это, но это не так.Примеры в документах Camel, похоже, не работают.Вот мой код из метода configure RouteBuilder:

    from("file://" + env.getProperty("integration.directory.scan.add.eng.jobslist")+"?consumer.initialDelay=100000")
        .doTry()
            .setProperty("servicePath").constant("/job")
            .setProperty("serviceMethod").constant("POST")
            .process("engImportJobsFromFileProcessor")
        .doCatch(Exception.class)
            .to("log:-- Add Job(s) Error -------------------------")
            .choice()
                .when(constant(env.getProperty("eng.mail.enabled.flag.add.jobslist.yn")).isEqualToIgnoreCase("Y"))
                    .setHeader("subject", constant(env.getProperty("integration.mq.topic.add.eng.jobslist.error.email.subject")))
                    .to("direct://email.eng")
                .otherwise()
                    .to("log:-----------------------------------------")
                    .to("log:-- Email for JOBSLIST IS DISABLED")
                    .to("log:-----------------------------------------")
            .end()
        .end()
        .log("Finished loading jobs from file ")
    ;

Как вы можете видеть, я попытался установить 'initialDelay', я также пробовал 'delay' и 'readLock = changes' иничто не имело значения.Как только файл попадает в каталог, Camel начинает обработку.Все, что мне нужно, это хорошая простая задержка перед опросом файла.Есть идеи?

Ответы [ 3 ]

0 голосов
/ 16 октября 2018

Используйте комбинацию параметров «readLock = updated», «readLockCheckInterval = 1000» и readLockMinAge = 20 с (1000 в миллисекундах, и значение по умолчанию следует изменить на более высокое значение, если запись выполняется медленнее, т.е. размер файла изменяется последолгое время это может происходить в определенных файловых системах, когда размер файла изменяется не очень часто во время передачи)

Документация по компонентам файла @ http://camel.apache.org/file2.html говорит

для чтения = изменено

изменено - используется длина файла / метка времени изменения, чтобы определить, копируется ли файл в данный момент или нет.По крайней мере, использовать 1 сек.чтобы определить это, этот параметр не может использовать файлы так же быстро, как другие, но может быть более надежным, поскольку API ввода-вывода JDK не всегда может определить, используется ли файл в настоящее время другим процессом.Опция readLockCheckInterval может использоваться для установки частоты проверки.

для readLockCheckInterval = 1000

Camel 2.6: интервал в миллисекундах для блокировки чтения, если поддерживается блокировкой чтения.Этот интервал используется для сна между попытками получить блокировку чтения.Например, при использовании измененной блокировки чтения вы можете установить интервал с более высоким интервалом для медленной записи.По умолчанию 1 сек.может быть слишком быстрым, если продюсер очень медленно записывает файл.

для readLockMinAge = 20 с

Верблюд 2.15: эта опция применяется только к readLock = change.Этот параметр позволяет указать минимальный возраст файла, который должен быть до попытки установить блокировку чтения.Например, используйте readLockMinAge = 300s, чтобы указать, что файлу не менее 5 минут.Это может ускорить опрос, когда файл станет достаточно старым, поскольку он немедленно установит блокировку чтения.

Таким образом, в конечном итоге ваша конечная точка должна выглядеть примерно так:

from ("file: //" + env.getProperty ("интеграции.directory.scan.add.eng.jobslist).") +"? consumer.initialDelay = 100000 & = изменено блокировкой чтения и readLockCheckInterval = 1000 & readLockMinAge = 20s ")

0 голосов
/ 23 октября 2018

ОК, оказалось сочетание вещей.Во-первых, я тестирую внутри IntelliJ, а также снаружи по нескольким причинам - одна из них связана с безопасностью при использовании электронной почты в IDEA.Tomcat за пределами IntelliJ собирал папку классов в каталоге webapps / ROOT, которая переписывала мои изменения в параметрах uri.Это то, что сводило меня с ума.Эта ROOT-папка была там из-за ошибки развертывания несколько месяцев назад.Но IntelliJ его не подхватил, хотя я использовал тот же экземпляр Tomcat.Вот почему кажется, что мои изменения игнорировались.

0 голосов
/ 15 октября 2018

Используйте параметр readLockMinAge.

Из Документация по компоненту File2 :

Эта опция позволяет указать минимальный возраст файла, который должен быть до попыткиприобрести блокировку чтения.Например, используйте readLockMinAge=300s, чтобы указать, что файлу не менее 5 минут.

Для задержки в 100 с URI может выглядеть следующим образом:

from("file://" + env.getProperty("integration.directory.scan.add.eng.jobslist")+"?readLock=changed&readLockMinAge=100s")
...