2015-11-23 2 views
0

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

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

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 

(идентификатор здесь не auto_increment номер, который генерируется из MySQL)

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

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

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

ответ

2

Хороший вариант может быть:

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

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

+0

Именно это моя проблема: как я могу гарантировать, что маршрут, который вставляет данные, выполняется до запуска одного из двух других маршрутов? Все три маршрута должны были считываться из файла, и единственный способ запустить их afaik - использовать «» и таким образом нет контроля над этим – Milla

+0

. Я думаю, что самый простой путь состоит в том, чтобы иметь две партии. Первый содержит каталог со всеми данными для вставки и удаления или перемещения данных после обработки. Вторая партия запускается автоматически, когда в предыдущем каталоге больше нет данных. – Aurelien

0
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.

+0

В этом случае данные могут быть потеряны, если БД спускается после завершения маршрута 1 и до начала маршрута 2, поскольку маршрут 2 никогда не запускается независимо. – Milla

+0

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

Смежные вопросы