Я попытаюсь дать вам несколько идей для ваших разных точек.
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
.
Спасибо, Алекс. Позвольте мне попробовать предложенный подход и посмотреть, как это происходит – Alpajna