Опрос Apache Camel JDBC и идемпотентность

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

Есть ли стандартный способ сделать это?


person Mark Murfin    schedule 14.04.2017    source источник


Ответы (2)


В многопользовательской базе данных строки с более низким идентификатором последовательности могут быть зафиксированы после строк с более высоким идентификатором (конечно, в Oracle и SQLServer, я подозреваю, что в любых СУБД с поддержкой транзакций). В этом случае простое отслеживание последнего обработанного идентификатора может привести к тому, что строки никогда не будут обработаны.

Самое простое решение проблемы, если вы контролируете схему и являетесь единственным, кто обрабатывает эту таблицу, — это добавить в таблицу какой-то «обработанный» столбец и обновить этот столбец (как предлагает @Arnaud).

Если это не вариант, то есть 3 других механизма, которые я рассмотрел для решения этой проблемы:

  1. Добавьте в таблицу триггер при вставке, чтобы вставить запись в сопутствующую таблицу, которая ссылается на вашу таблицу и включает обработанный столбец. Измените свой запрос, чтобы соединить две таблицы, и пометьте строку как обработанную, обновив сопутствующую таблицу так же, как описано выше.
  2. Создайте сопутствующую таблицу и вставьте сюда строки, чтобы пометить строку в основной таблице как обработанную. Затем ваш запрос на опрос должен будет искать строки, которых нет в сопутствующей таблице.
  3. Отслеживайте любые отсутствующие идентификаторы последовательностей. Ищите их явно в каждом опросе.

Я выбрал 2, так как его было проще реализовать независимым от СУБД образом, и требовалось всего лишь вставить, чтобы пометить строку как обработанную.

person Paul M    schedule 15.04.2017

В документации Camel для компонента sql есть свойство onConsume :

"...После обработки каждой строки этот запрос может быть выполнен, если обмен был обработан успешно, например, чтобы пометить строку как обработанную..."

person Arnaud    schedule 14.04.2017