Как обрабатывать несколько разных файлов разными способами с помощью Spring Batch

Фон/контекст

Я вижу почти бесчисленное количество примеров того, как обрабатывать несколько файлов с помощью Spring Batch, но каждый из них имеет один объект, в который обрабатываются все файлы. Таким образом, многие файлы, содержащие совместимые данные, обрабатываются в одну цель назначения, например, в таблицу базы данных.

Я хочу создать процесс импорта, который будет принимать десять разных файлов и сопоставлять их с десятью разными целевыми таблицами в той же базе данных/схеме. Имена файлов также будут немного меняться в предсказуемой/кодируемой манере каждый день, но я думаю, что смогу справиться с этим. Я думал, что Spring может это сделать (сопоставление данных «многие ко многим»), но это последнее, что я не нахожу, КАК это сделать. Декларативная структура Spring отлично подходит для некоторых вещей, но я, честно говоря, не уверен, как настроить множественные сопоставления, и, поскольку на самом деле нет процедурной части приложения, о которой можно было бы говорить, я не могу использовать какую-либо форму итерации. . Я мог бы просто сделать отдельные jar-файлы для каждого файла и запрограммировать итерацию на консоли, но это также усложняет ведение журнала и создание отчетов... и, честно говоря, это звучит хакерски.

Вопрос

Как указать Spring Batch обрабатывать каждый из десяти разных файлов десятью разными способами и сопоставлять их данные с десятью разными таблицами в одной базе данных?

Пример:

  • Файл Data_20190501_ABC_000.txt содержит 4 столбца данных, разделенных тильдой, и его необходимо сопоставить с таблицей ABC_data с 6 столбцами (два из которых являются метаданными).
  • Файл Data_20190501_DEF_000.txt содержит 12 столбцов данных, разделенных тильдой, и его необходимо сопоставить с таблицей DEF_data с 14 столбцами (два из которых являются метаданными).
  • Файл Data_20190501_GHI_000.txt содержит 10 столбцов данных, разделенных тильдой, и его необходимо сопоставить с таблицей GHI_data с 12 столбцами (два из которых являются метаданными).
  • и т.д... для десяти разных файлов и таблиц

Я могу обрабатывать тильду-разделитель, Я ДУМАЮ, что могу программно обрабатывать даты в именах файлов, а одно из полей можно обрабатывать в триггере БД. другое поле метаданных должно быть именем файла, но это, безусловно, может быть другим вопросом.

ОБНОВИТЬ

В соответствии с тем, что, как мне кажется, предложил Махмуд Бен Хассин, я сделал отдельные программы чтения, сопоставления и записи для каждой пары файл/таблица и попытался добавить их с помощью парадигмы start(step1), next(step2), build() в формате ниже на основе примеров на странице Настройка и запуск задания из документации Spring:

@Autowired
private JobBuilderFactory jobs;

@Bean
public Job job(@Qualifier("step1") Step step1, @Qualifier("step2") Step step2) {
    return jobs.get("myJob").start(step1).next(step2).build();
}

Любой шаг выполняется независимо, но как только я добавляю один в качестве «следующего» шага, он выполняет только первый и генерирует ИНФО-сообщение «Шаг уже завершен или не перезапускается, поэтому никаких действий для выполнения» в выводе журнала - где мне уйти отсюда?


person Code Jockey    schedule 01.05.2019    source источник


Ответы (1)


Шаг, ориентированный на фрагменты, в Spring Batch может одновременно обрабатывать только один тип элементов. Я бы использовал задание с различными шагами, ориентированными на фрагменты. Эти шаги можно выполнять параллельно, поскольку между входными файлами нет связи/порядка.

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

Надеюсь это поможет.

person Mahmoud Ben Hassine    schedule 01.05.2019
comment
Я сделал то, что, Я ДУМАЮ, вы предлагаете, и все компилируется, и, похоже, он распознает два шага, но выполняет только первый шаг. пожалуйста, смотрите обновление в моем вопросе - person Code Jockey; 01.05.2019
comment
Ваше определение задания будет последовательно выполнять шаги. Вы можете запускать их параллельно, как это сделать, смотрите в этом разделе: docs.spring.io/spring-batch/4.1.x/reference/html/. Что касается информационного сообщения Step already complete.., обратите внимание, что по умолчанию шаг не выполняется повторно, если он был завершен в предыдущем запуске. Вы можете переопределить это поведение и запускать его каждый раз, установив флаг allowStartIfComplete. - person Mahmoud Ben Hassine; 02.05.2019