Являются ли batchlets правильным способом реализации шагов ETL в JavaEE Batch?

Я изучаю Javaee Batch API (jsr-352), чтобы проверить возможность замены текущего инструмента ETL для нашего собственного решения, использующего эту технологию.

Моя цель - построить работу, в которой я:

  • получить некоторые (фиктивные) данные из источника данных в шаге 1,
  • некоторые другие данные из другого источника данных в шаге 2 и
  • объединить их в шаге 3.

Я хотел бы обработать каждый элемент и не записывать в файл, а отправить его на следующий шаг. А также хранить информацию для дальнейшего использования. Я мог бы сделать это с помощью пакетиков и jobContext.setTransientUserData(),

Я думаю, что я не понимаю концепции: насколько я понял, JSR-352 предназначен для такого рода задач ETL, но имеет 2 типа шагов: чанк и пакетные операции. Чанки - это "3-фазные шаги", при которых считываются, обрабатываются и записываются данные. Пакеты - это задачи, которые выполняются не для каждого элемента данных, а один раз (например, для расчета итогов, отправки электронной почты и т. Д.).

Моя проблема заключается в том, что мое решение не является правильным, если я рассматриваю определение пакетов.

Как можно реализовать эту работу, используя Javaee Batch API?

1 ответ

Решение

Я думаю, что для реализации ETL лучше использовать chunk, а не batchlet. Типичная обработка чанка с источником данных выглядит примерно так:

  • ItemReader#open(): открыть курсор (создать Connection, Statement а также ResultSet) и сохраните их как переменные экземпляра ItemReader,
  • ItemReader#readItem(): создать и вернуть объект, содержащий данные строки, используя ResultSet
  • ItemReader#close(): закрыть ресурсы JDBC
  • ItemProcessor#processItem(): сделать расчет и создать и вернуть объект, который содержит результат
  • ItemWriter#writeItems(): сохранить рассчитанные данные в базу данных. открыть Connection, Statement и вызвать executeUpdate() и закрой их.

Что касается вашей ситуации, я думаю, что вы должны выбрать те данные, которые считаются первичными, и открыть курсор для них в ItemReader#open(), затем получить еще один в ItemProcessor#processItem() за каждый предмет.

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

Мои записи в блоге о JBatch и обработке чанков:

Другие вопросы по тегам