spring batch reference 阅读随笔。
这个,我是从后面往前读的。因为从前往后是在看不懂。
?
1。
直接看 AppenedixB
很多数据库表的图,有主键键,有列名。
如:
表名有BATCH_JOB_INSTANCE,
主键有JOB_INSTANCE_ID
其他键VERSION,JOB_NAME,JOB_KEY
这就说明,spring batch 中的任务task可存在数据库中。其他的表有BATCH_JOB_PARAMS
BATCH_JOB_EXCUTION
BATCH_STEP_EXECUTION等。
batch根据这些表的内容,生成task,和executor,规则,
并从这些表中读取上次任务执行的进度,以便“断点续传”。
?
?
从后往前,依次讲了,
一个任务如何把结果传递给后续任务,
在没有输入时捕获步骤成功,
执行cmd命令,或者dos命令?
如果平面文件中,各个行有不同的解析规则,则可在配置文件中,根据行首字符串,分别为每行配置解析器。
某些数据库不能读取大量数据,容易锁住,那么可以先读取大量主键,而后通过主键一点一点取,边取边花,不怕贼偷钱。
在平面文件的最后行尾,书写概要总结,footer。
停止任务,由于业务原因,而不是突然停电,机房坏掉等。
写日志,包括处理过程,和处理失败日志。
以上是典型的Batch范式,就是常用用法,常备药。11章结束。
接着是UnitTest,测试先不管了。10章结束。
定义重试规则,任务失败需要重试的。如何修改xml配置文件,添加spring提供的拦截器,来处理重试。
重试的启发用的监听器,listener,open,onError,close三个方法。
回滚策略,重试之前要回滚。
重试策略,在什么情况下,或者捕获什么异常之后回滚。甚至可以为不同的异常采用不同的回滚方法。
无状态回滚,有状态回滚。。因为阅读时从文章后面往前的,那么有状态回滚和重试策略很近。
两种类型的回滚的Callback直接作为template.execute的参数,并依次执行。
retryContext是retryCallback.recover()的参数,从中可以得到上文传递过来的结果。
RetryTemplate,有诸多的execute方法,参数是callback。
回顾,第11章是一些不常用的高级特性,第十章是测试,第9章是回滚和重试即处理异常。
?
定义迭代器,用于将一堆零碎的时间打包,集体处理。
并行处理。
监听器。
异常处理。
完成策略。
重复模板,包括重复上下文,重复状态。
第8章,repeat。用于一系列细小常见的同类事件,集体处理。
?
结束哦。明天再看。
?
?继续拉,依然是从后往前看。
7.3.4 binding input data to steps 。
其中的input data 指来自数据库啊,平面文件,xml,而step是spring batch的最小执行单位,就像走路最小走一步。
?
7.4.2 partitioner
为新建一个step创建参数,注意,是新建,不包含step的restart。
7.4.1 partitionhandler,将stepExecution包装 ,发给远程的步骤。remote steps。就像网线一样,而不是电脑或者猫。。。
7.4
partition是将一个master step做成好几个slave step的干活,他也负责执行slave step。。。读者要杀我了。。解释不清,继续往前看。
7.3
remote chunking
啊,对了,这里就介绍remote了。
master step 通过 remote chunking 管理很多 slave step...
72.并行step
7.1 多线程 step
?
-----------------
第二部分,sample。李梓萌,例子们。
?
?football,football有三步,
第一步Loadplayer
从csv文件中读出数据,使用spring的自带类,给该类配置属性mapper,而这个mapper是例子的类的。从而spring将csv文件的内容mapper成一个一个player对象..
第二步。loadGame
跟第一步差不多一样,使用spring自带类,配置一个mapper,而这个mapper是项目的。从而得到game对象。
第三步。统计:D,
从数据库中拿,sql语句在配置文件中,为spring自带类配置两个数据,一个是 sql,一个是mapper,mapper是项目的,sql也是项目的。。。
第三步的writer,,保存统计结果,项目自己的的jdbcWiter,为其配置属性dataSource。
------------------
配置文件:
datasource的来源。
?
main/resources/data-source-context.xml
main/resources/batch-oracle.properties
.properties内容:batch.jdbc.url = jdbc:oracle:thin:@oracle:1521:xe
上面这行很熟悉吧。
?
?-- Autogenerated: do not edit this fileDROP TABLE BATCH_STEP_EXECUTION_CONTEXT ;DROP TABLE BATCH_JOB_EXECUTION_CONTEXT ;DROP TABLE BATCH_STEP_EXECUTION ;DROP TABLE BATCH_JOB_EXECUTION ;DROP TABLE BATCH_JOB_PARAMS ;DROP TABLE BATCH_JOB_INSTANCE ;DROP SEQUENCE BATCH_STEP_EXECUTION_SEQ ;DROP SEQUENCE BATCH_JOB_EXECUTION_SEQ ;DROP SEQUENCE BATCH_JOB_SEQ ;
?
?第一个例子跑成了。football的例子。
samples/src/test/java/org/springframework/batch/sample/FootballJobFunctionalTests.java右键runas junit
所有的batch依赖的建表删表操作都由batch自己自动完成。
?
?
?
------------------------------
下面继续。
阅读定时任务的实现,并和自己系统上的使用quartz的定时合并,或者更新。
例子中JobLauncherDetailsTests用来做quartz的定时测试,分before,test两步。。。
quartz-job-lancher-context.xml中似乎包含所有quartz的特性,包括,
1,定时的
为?
org.springframework.scheduling.quartz.SchedulerFactoryBean
???<property name="cronExpression" value="0/10 * * * * ?" />设置triggers参数。。
,2<bean id="jobDetail" />
??<bean id="jobLauncher" />
??<bean id="jobLauncher" />
test
import org.quartz.JobExecutionContext;
import org.springframework.batch.core.configuration.JobLocator;
import org.springframework.batch.core.launch.JobLauncher;
可见,两者使用的类不大一样,不具备配对关系。
那么,既然junit不引用xml,那么xml被谁用呢,怎么用呢?
下次再看。
--------------------------
.lanch中出现了上面的xml,eclipse右键的run?configuration 中有一个quartzLauncher,一切清晰了。
遇到复合条件的job,可以用eclipse右键run as 搞搞。等下确认。
-----
在spring batch sample上右键使用quartzLauncher运行,提示错误。
Referenced classpath provider does not exist: org.maven.ide.eclipse.launchconfig.classpathProvider
?,
-------
?
似乎需要安装http://m2eclipse.sonatype.org/sites/m2e?eclipse的mvn插件,注意,是eclipse的插件,为了在eclipse中执行mvn,而不是mvn的eclipse插件,后者通过mvn命令构造eclipse工程目录文件。
待确认。
?------------
已确认。正确。但,官方的m2e不能下载,需要在csdn上下载。。不能使用eclipse update,需要离线包。
------
装好m2eclipse插件,右键spring-batch-sample,以quartz-launcher运行,可以出现1次成功,而后会出现错误,不过这个错误的提示说的很明白,任务已运行过,另外运行需要改变参数。。。所以这个错误也不算错误,故,上文说确认,正确。
?
在run configuration 中查看quartz-launcher,其运行参数为
quartz-job-launcher-context.xml jobs/footballJob.xml,main函数是,
org.springframework.batch.core.launch.support而在JobRegistryBackgroundJobRunner的api中,看到其main函数的参数例子为:
?
$ java -classpath ... JobRegistryBackgroundJobRunner job-registry-context.xml job1.xml job2.xml ...
。
一切清晰了吧。
前面的context.xml指quartz之类的有特性的任务加载器,后面则是各个任务的定义xml.
?------------
下一步,就脱离标题了。跑题了。由于项目需求,定时跑报表,需要分离springbatchsample.如果把整个例子的工程提交出去,肯定会被剁成肉包子。。所以,将必须的分离出来,将没有用的例子剔除出去。
---
下一步,注意查看spring batch 中断点续传的特性,关注实现这类任务需要的类。