您的位置:首页 > 编程语言 > Java开发

Spring Batch的配置文件解读

2015-02-11 15:15 309 查看

Batch configuration

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:batch="http://www.springframework.org/schema/batch"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/batch http://www.springframework.org/schema/batch/spring-batch.xsd"> 
<batch:job id="importProductsJob">
(...)
</batch:job>
</beans>

配置验证器:

<batch:validator ref="parameterValidator" />,用来校验工作参数(job parameters),可以实现JobParametersValidator接口。

如果无法通过验证,会抛出JobParametersInvalidException异常。spring batch提供了一个默认的实现类DefaultJobParametersValidator,完成绝大部分的工作。如果还是无法满足需求,可以自己编码实现接口。

实例:

<batch:job id="importProductsJob">
(...)
<batch:validator ref="validator"/>
</batch:job>
<bean id="validator" class="org.springframework.batch.core.job.DefaultJobParametersValidator">
<property name="requiredKeys">
<set>
<value>date</value>
</set>
</property>
<property name="optionalKeys">
<set>
<value>productId</value>
</set>
</property>
</bean>

Step listener:

Step listener 作为tasklet标签的一个子标签进行配置。用来跟踪step的处理过程。

<span style="font-size:14px;">    <batch:step id="step1" parent="parent" next="step2">
<batch:tasklet>
<batch:chunk reader="reader" processor="processer" chunk-completion-policy="completionPolicy" />
<batch:listeners merge="true">
<batch:listener ref="stepLogListener" />
</batch:listeners>
</batch:tasklet>
</batch:step></span>
<span style="font-size:14px;">  <bean id="<span style="font-size:14px;">stepLogListener</span>" class="test.S<span style="font-size:14px;">tepLogListener</span>"
scope="step">
<property name="item" value="A" />
<property name="Msg" value="zzzz" />
</bean>
</span>

利用监听来出力step执行前后的Log
注意:listeners标签,提供merge属性,可以用来合并parent和自身的listener

并行的Step:

多个step之间的并行化,可以提高批处理的效率。什么情况下可以应用step之间的并行化,那就要根据具体的业务需求来定。那我们假设有这样一种场景:有一类数据,分别存在于文件和数据库,数据的内容一样,只是形式不一样,那么我们可以定义并行的step来分别处理来自文件的数据和来自数据库的数据,然后,分别进行同样的processor,然后写入数据库。
<span style="font-size:12px;">    <bean id="taskExecutor" class="org.springframework.core.task.SimpleAsyncTaskExecutor" />
<!-- 并行的step -->
<batch:job id="addPeopleDescJob">
<batch:split id="split1" task-executor="taskExecutor">
<batch:flow>
<batch:step id="parallel_step_1">
<batch:tasklet>
<batch:chunk reader="peopleAddDescReader_db"
processor="addDescProcessor" writer="addDescPeopleWriter"
commit-interval="10" />
</batch:tasklet>
</batch:step>
</batch:flow>
<batch:flow>
<batch:step id="parallel_step_2">
<batch:tasklet>
<batch:chunk reader="peopleAddDescReader_file"
processor="addDescProcessor" writer="addDescPeopleWriter"
commit-interval="10" />
</batch:tasklet>
</batch:step>
</batch:flow>
</batch:split>
</batch:job>
</span>

task-executor指定了一个异步任务执行器 SimpleAsyncTaskExecutor,该执行器将会按照配置创建指定数目的线程来进行数据处理。通过这种方式,避免了我们手动创建并管理线程的工作,使我们只需要关注业务处理本身。
表 1. 任务执行器列表
 
类名描述是否异步
SyncTaskExecutor 简单同步执行器
ThrottledTaskExecutor 该执行器为其他任意执行器的装饰类,并完成提供执行次数限制的功能视被装饰的执行器而定
SimpleAsyncTaskExecutor 简单异步执行器,提供了一种最基本的异步执行实现
WorkManagerTaskExecutor 该类作为通过 JCA 规范进行任务执行的实现,其包含 JBossWorkManagerTaskExecutor 和 GlassFishWorkManagerTaskExecutor 两个子类
ThreadPoolTaskExecutor 线程池任务执行器


参考资料:

http://kanpiaoxue.iteye.com/blog/1770683

http://my.oschina.net/xinxingegeya/blog/344720

http://www.ibm.com/developerworks/cn/java/j-lo-springbatch2/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息