Реализация ETL с использованием Spring Batch

Мне нужно реализовать приложение ETL для одного из проектов, над которым я работаю.

Он состоит из следующих шагов:

  1. Необходимо читать из таблицы, чтобы получить некоторые значения, которые будут переданы как параметры задания.
  2. Возвращенный на шаге 1 объект будет в дальнейшем использоваться для извлечения некоторых данных из второй таблицы.
  3. Затем необходимо прочитать из плоского файла, который будет использоваться вместе со значениями из шага 2. Примените бизнес-логику. Затем напишите в таблицу.

Мы используем Spring Data JPA, интеграцию Spring.

Проблема, с которой я столкнулся, - это прочитать значения из таблицы, чтобы получить параметры для задания, а затем запустить задание.

И затем результат шага 2 должен быть отправлен вместе с информацией о файле для дальнейшей обработки.

Я знаю, как выполнить вышеперечисленные шаги независимо, но изо всех сил пытаюсь связать их от начала до конца.

Было бы здорово поделиться любыми идеями по созданию вышеперечисленного. Заранее спасибо.


person Alpajna    schedule 06.10.2015    source источник


Ответы (1)


Я постараюсь дать вам несколько идей для разных точек зрения.

1 - Считайте значения таблицы и передайте их как параметры задания

Я вижу здесь 2 решения:

Вы можете выполнить «ручной» запрос (то есть без springbatch), а затем выполнить свою бизнес-логику, чтобы передать результаты как JobParameters (вам просто нужен JobLauncher или CommandLineJobRunner, см. Springbatch Documentation §4.4):

JobLauncher jobLauncher = (JobLauncher) context.getBean("jobLauncher");
Job job = (Job) context.getBean(jobName);

// Do your business logic and your database query here.

// Create your parameters
JobParameter parameter = new JobParameter(resultOfQuery);

// Add them to a map
Map<String, JobParameter> parameters = new HashMap<String, JobParameter>();
parameters.add("yourParameter", parameter);

// Pass them to the job
JobParameters jobParameters = new JobParameters(parameters);
JobExecution execution = jobLauncher.run(job, parameters);

Другое решение - добавить JobExecutionListener и переопределить метод beforeJob для выполнения вашего запроса, а затем сохранить результаты в executionContext (к которому вы затем можете получить доступ с помощью: #{jobExecutionContext[name]}).

@Override
public void beforeJob(JobExecution jobExecution) {

    // Do your business logic and your database query here.

    jobExecution.getExecutionContext().put(key, value);
}

В любом случае вы можете использовать SpringBatch ItemReader для выполнения вашего запроса. Вы можете, например, объявить читателя элементов как поле для вашего слушателя (не забудьте установить сеттер) и настроить его как таковое:

<batch:listener>
    <bean class="xx.xx.xx.YourListener">
        <property name="reader">
            <bean class="org.springframework.batch.item.database.JdbcCursorItemReader">
                <property name="dataSource" ref="dataSource"></property>
                <property name="sql" value="${yourSQL}"></property>
                 <property name="rowMapper">
                    <bean class="xx.xx.xx.YourRowMapper"></bean>
                </property>
            </bean>
        </property>
    </bean>
</batch:listener>

2 - Прочтите таблицу в зависимости от результатов предыдущего шага

И снова вы можете использовать JobExecutionContext для хранения и получения данных между шагами. Затем вы можете реализовать StepExecutionListener, чтобы переопределить метод beforeStep и получить доступ к StepExecution, что приведет вас к JobExecution.

3 - Отправлять результат чтения таблицы вместе с результатами чтения файла

Не существует "по умолчанию" CompositeItemReader, которое позволило бы вам читать из 2 источников одновременно, но я не думаю, что вы действительно хотите это делать.

В вашем случае я бы объявил «читателя таблицы» читателем в <batch:chunk>, а затем объявил бы пользовательский ItemProcessor, который будет иметь другое поле ItemReader. Этот читатель будет вашим FlatFileItemReader. Затем вы можете вручную запустить чтение и применить свою бизнес-логику в методе process.

person Thrax    schedule 06.10.2015
comment
Спасибо, Алекс. Позвольте мне попробовать предложенный подход и посмотреть, как он пойдет - person Alpajna; 08.10.2015