1.在spring原有的item reader基础上扩展功能时,需要自定义代理reader
public class CustomCompositeItemWriter<T> implements ItemReader<T>{
private final ItemReader delegate;
public CustomCompositeItemWriter(){}
public CustomCompositeItemWriter(ItemReader delegate){
this.delegate = delegate;
}
public synchronized T read () throws UnexpectedInputException, ParseException, NonTransientResourceException, Exception {
return delegate.read();
}
}
<!-- 配置代理reader时,应在chunk内配置streams
将被代理reader注入,否则无法执行
-->
<job id="ioSampleJob"> <step name="step1"> <tasklet> <chunk reader="fooReader" processor="fooProcessor" writer="compositeItemWriter" commit-interval="2"> <streams> <stream ref="barWriter" /> </streams> </chunk> </tasklet> </step> </job> <!-- 代理reader注入 --> <bean id="compositeItemWriter" class="...CustomCompositeItemWriter"> <property name="delegate" ref="barWriter" /> </bean> <!-- 被代理reader配置 --> <bean id="barWriter" class="...BarWriter" />
2.多线程step
使用多线程step时,ItemReader应注意线程安全的问题:如Spring Batch提供的
HibernateCursorItemReader为非线程安全的,在多线程的情况下,会报无法读取下一行问题,因此在多线程执行时应查询spring batch api,确认该reader是否为线程安全的,如果不是应使用代理类将其转换为线程安全的
<bean id="syncHibernateCursorItemReader" class="com.lei.demo.job.reader.SynchronizedItemReader">
<constructor-arg>
<ref bean="operlogReader"/>
</constructor-arg>
</bean>
<batch:job id="multiThreadJob2">
<batch:step id="multiThreadStep2">
<batch:tasklet task-executor="taskExecutor" throttle-limit="4">
<batch:chunk reader="syncHibernateCursorItemReader" processor="operLogProcesser" writer="consoleWriter" commit-interval="1">
<batch:streams>
<batch:stream ref="operlogReader" />
</batch:streams>
</batch:chunk>
</batch:tasklet>
</batch:step>
</batch:job>
也可以使用其提供的线程安全的ItemReader如:
<bean id="pageOperlogReader" class="org.springframework.batch.item.database.HibernatePagingItemReader" scope="step">
<property name="sessionFactory" ref="sessionFactory" />
<property name="queryString" value="from NplmSystemOperlog"/>
<property name="saveState" value="false"/>
<property name="pageSize" value="2"/>
<property name="maxItemCount" value="20"/>
</bean>