Я постараюсь дать вам несколько идей для разных точек зрения.
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