Хобрук: Ваш путь к мастерству в программировании

Apache camel синхронизирует маршруты файлов

У меня есть данные в трех отдельных CSV-файлах, которые нужно импортировать в базу данных MySQL. Итак, у меня есть три верблюжьих маршрута, каждый из которых читает из файла, а затем вставляет / обновляет БД.

Один из этих трех файлов содержит вставленные наборы данных, а два других обновляют данные из первого, который только что был вставлен.

CSV-File-1 -> INSERT INTO table (id,...) VALUES ($id,...)
CSV-File-2 -> UPDATE table SET field = $value WHERE id = $idFromTheJustInsertedDataset
CSV-File-3 -> UPDATE table SET field = $value WHERE id = $idFromTheJustInsertedDataset

(id здесь не номер auto_increment, сгенерированный из MySQL)

Теперь проблема заключается в том, что, когда первый маршрут для вставки данных не запускается до двух других, данные теряются, потому что я не получаю никакой ошибки от mysql (id просто не существует, потому что он еще не был вставлен - запрос все еще в силе).

Таким образом, потребитель файла camel запускается каждые xxx миллисекунд, и я не знаю никакой возможности определить, в каком порядке должны выполняться эти три маршрута. Также невозможно использовать другой файл (один раз) внутри маршрута - по крайней мере, я не могу понять, как это можно сделать.

Кто-нибудь знает, как я мог синхронизировать эти маршруты?


Ответы:


1

Хорошим вариантом могут стать:

  1. Маршрут 1 (для CSV-файла-1) оставьте как есть.
  2. Для route 2 и route 3 добавьте параметр doneFileName и сгенерируйте .done файлы из bean-компонента в конце route 1. Таким образом, обработка начнется только тогда, когда route 1 будет завершено
23.11.2015

2

Как указано в документации Camel для параллельной обработки, каждое сообщение как элементарная единица. Итак, возможно, вы могли бы немного переделать свою программу, чтобы сначала обрабатывать данные, содержащие файлы, которые нужно вставить, а затем, как только этот первый шаг будет выполнен, вы обработаете другие файлы.

23.11.2015
  • Именно в этом и заключается моя проблема: как я могу гарантировать, что первый маршрут, который вставляет данные, будет выполнен до того, как начнется один из двух других маршрутов? Все три маршрута должны быть прочитаны из файла, и единственный способ запустить их afaik - это использовать ‹from uri = file: .... /› и таким образом нет никакого контроля над этим. 23.11.2015
  • Я думаю, что проще всего было бы иметь две партии. Первый содержит каталог со всеми данными для вставки, удаления или перемещения данных после обработки. Второй пакет запускается автоматически, когда в предыдущем каталоге больше нет данных. 23.11.2015

  • 3
    I think you can have two routes, one for reading from the directory and other route should be called from the end of the first route. first route will insert into DB and second will update record.
    form("Route Name")
    .routeId("InsertRoute")
    .bean(InsertDB.class, "insertIntoDB()")
    .to("direct:updateRoute");
    
    form("direct:updateRoute")
    .routeId("updateDBRoute")
    .bean(UpdateDB.class, "updateData()")
    .end();
    

    Это должно гарантировать, что модификация будет запущена только после завершения вставки. Однако при таком подходе у вас не будет прослушивателя для файла обновления. Поэтому все файлы обновлений нужно читать вручную внутри класса UpdateDB.

    23.11.2015
  • В этом случае данные могут быть потеряны, если БД отключается после выполнения маршрута 1 и до запуска маршрута 2, потому что маршрут 2 никогда не запускается независимо. 24.11.2015
  • Для этого вы должны убедиться, что все операции с БД являются частью только одного маршрута, и использовать .transact () в начале маршрута. Если вы должны реализовать два маршрута, добавьте .onException () во второй маршрут и поместите какой-нибудь файл, который может содержать запрос на удаление для всех вставленных данных из маршрута 1. Теперь поместите этот файл запроса на удаление в какую-нибудь папку, для которой вам нужно будет написать маршрут в новом классе построителя маршрутов. В новом маршруте вы можете установить .maximumRedeliveries (). Однако я предпочитаю размещать все операции с БД только в одном маршруте. 24.11.2015
  • Новые материалы

    Прогресс в технологии Трансформеров часть 3
    Многомасштабный управляющий сигнальный преобразователь для бесфазного синтеза движения (arXiv) Автор: Линтао Ван , Кун Ху , Лей Бай , Юй Дин , Ваньли Оуян , Чжиюн Ван . Аннотация:..

    Представляем поддержку компонентов Vue.js. Мгновенный HMR и многое другое.
    Хотя у FuseBox уже был плагин Vue, он был базовым и не имел многих функций, которые делали работу с Vue.js такой приятной. Однако с этим выпуском мы рады сообщить, что в FuseBox..

    Приключения в Javascript, часть 1
    Я продолжаю думать о том, чтобы писать больше, но чем больше я думаю об этом, тем меньше я это делаю. Итак, сегодня я перестал думать и начал писать. Отсюда можно только спускаться… В..

    Понимание дженериков в TypeScript: подробное руководство
    Введение TypeScript, строго типизированный надмножество JavaScript, хорошо известен своей способностью улучшать масштабируемость, удобочитаемость и ремонтопригодность приложений. Одной из..

    Учебные заметки JavaScript Object Oriented Labs
    Вот моя седьмая неделя обучения программированию. После ruby ​​и его фреймворка rails я начал изучать самый популярный язык интерфейса — javascript. В отличие от ruby, javascript — это более..

    Разбор строк запроса в vue.js
    Иногда вам нужно получить данные из строк запроса, в этой статье показано, как это сделать. В жизни каждого дизайнера/разработчика наступает момент, когда им необходимо беспрепятственно..

    Предсказание моей следующей любимой книги 📚 Благодаря данным Goodreads и машинному обучению 👨‍💻
    «Если вы не любите читать, значит, вы не нашли нужную книгу». - J.K. Роулинг Эта статья сильно отличается от тех, к которым вы, возможно, привыкли . Мне очень понравилось поработать над..