Spring Batch的配置文件解读

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

扫描二维码关注公众号,回复: 2116315 查看本文章

http://www.ibm.com/developerworks/cn/java/j-lo-springbatch2/

猜你喜欢

转载自blog.csdn.net/adobeid/article/details/43734405