没有可立即使用的组件可以执行您的要求;唯一的解决方案是编写一个
ItemReader<>委托给
JdbcCursorItemReader(或委托给或委托
HibernateCursorItemReader给任何通用
ItemReader实现)的自定义。
您需要准备所有必要的东西(数据源,会话,实际数据库读取器),并将所有委派的读取器绑定到您的自定义读取器。
编辑:您需要使用recussion来模拟一个循环,
ItemReader.read()并在整个作业重新启动期间保留阅读器和委托状态。
class MyItemReader<T> implements ItemReader<T>, ItemStream { private ItemReader[] delegates; private int delegateIndex; private ItemReader<T> currentDelegate; private ExecutionContext stepExecutionContext; public void setDelegates(ItemReader[] delegates) { this.delegates = delegates; } @BeforeStep private void beforeStep(StepExecution stepExecution) { this.stepExecutionContext = stepExecution.getExecutionContext(); } public T read() { T item = null; if(null != currentDelegate) { item = currentDelegate.read(); if(null == item) { ((ItemStream)this.currentDelegate).close(); this.currentDelegate = null; } } // Move to next delegate if previous was exhausted! if(null == item && this.delegateIndex< this.delegates.length) { this.currentDelegate = this.delegates[this.currentIndex++]; ((ItemStream)this.currentDelegate).open(this.stepExecutionContext); update(this.stepExecutionContext); // Recurse to read() to simulate loop through delegates item = read(); } return item; } public void open(ExecutionContext ctx) { // During open restore last active reader and restore its state if(ctx.containsKey("index")) { this.delegateIndex = ctx.getInt("index"); this.currentDelegate = this.delegates[this.delegateIndex]; ((ItemStream)this.currentDelegate ).open(ctx); } } public void update(ExecutionContext ctx) { // Update current delegate index and state ctx.putInt("index", this.delegateIndex); if(null != this.currentDelegate) { ((ItemStream)this.currentDelegate).update(ctx); } } public void close(ExecutionContext ctx) { if(null != this.currentDelegate) { ((ItemStream)this.currentDelegate).close(); }}<bean id="myItemReader" class=path.to.MyItemReader> <property name="delegates"> <array> <ref bean="itemReader1"/> <ref bean="itemReader2"/> <ref bean="itemReader3"/> </array> </property></bean>
EDIT2:记住设置属性 名称 ;这是让MyItemReader.read()正常工作所必需的
<bean id="itemReader1" > <property name="name" value="itemReader1" /> <!-- Set other properties --></bean>



