我會盡量給你一些想法,爲你的不同點。
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
方法中應用您的業務邏輯。
謝謝Alex。讓我嘗試一下建議的方法,看看它是如何發展的 – Alpajna