2015-10-06 4 views
2

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

Он имеет следующие шаги:

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

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

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

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

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

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

ответ

0

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

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.

+0

Спасибо, Алекс. Позвольте мне попробовать предложенный подход и посмотреть, как это происходит – Alpajna

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