Spring batch 代理item reader实现及线程安全的Item reader

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>

转载于:https://my.oschina.net/lvzhitao/blog/758175

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值