spring batch reference 阅读随笔。

本文深入探讨Spring Batch的使用方法,包括任务管理、异常处理、并行处理等核心功能,并介绍了如何结合Quartz实现定时任务。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这个,我是从后面往前读的。因为从前往后是在看不懂。

 

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

上面这行很熟悉吧。

 

 bean id="dataSourceInitializer" class="test.jdbc.datasource.DataSourceInitializer">这个所谓初始化,其实就是删掉batch过程使用的,与实际业务逻辑无关的数据库表,drop ...STEP_TABLE

 

 

-------------------

告一段落。开始着手搭建环境跑例子了。 

 FootballJobFunctionalTests JUNIT入口。相当于MAIN()..运行,发现缺少类。

 加了若干依赖库。。

配置

 data-source-context.xml中的bean id = environment的参数defaultValue为oracle(原值hsql).

修改main/resources/batch-oracle.properties的内容为真实环境。改url,user,password..

 

 

这是删除batch系统从数据库中的代码。在batch源码的,core中的sql文件oracle。

-- Autogenerated: do not edit this file

DROP 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" class="org.springframework.scheduling.quartz.JobDetailBean">这中结构在quartz中也常见。

3。<bean id="jobRegistry" class="org.springframework.batch.core.configuration.support.MapJobRegistry" />
  <bean id="jobLauncher" class="org.springframework.batch.core.launch.support.SimpleJobLauncher">
 在这里,这个xml就完了。。

---------------------

另外,例子中,用来测试batch_quartz的

JobLauncherDetailsTests中,创建JobLauncherDetails对象,junit的setup将更新的值转存到测试用例的对象里。如在JobLauncherDetailsTests中。

而在各个方法里,分别创建创建quartz的jobDetail对象,将jobDetail设置到Context中,用JobLauncherDetails执行context。 

createNiceMock用来根据class创建对象。。。 

------

比较上面的xml和test,共同出现的类

org.springframework.batch.sample.quartz.JobLauncherDetails

不同,

1xml:

org.springframework.scheduling.quartz.CronTriggerBean

test:

import org.quartz.Scheduler;
import org.quartz.SimpleTrigger;
import org.quartz.spi.TriggerFiredBundle;

2xml

org.springframework.scheduling.quartz.JobDetailBean

org.springframework.scheduling.quartz.SchedulerFactoryBean

3xml

 <bean id="jobRegistry" class="org.springframework.batch.core.configuration.support.MapJobRegistry" />
  <bean id="jobLauncher" class="org.springframework.batch.core.launch.support.SimpleJobLauncher">

<bean class="org.springframework.core.task.SimpleAsyncTaskExecutor" />

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
Class JobRegistryBackgroundJobRunner

而在JobRegistryBackgroundJobRunner的api中,看到其main函数的参数例子为:

 

$ java -classpath ... JobRegistryBackgroundJobRunner job-registry-context.xml job1.xml job2.xml ...

一切清晰了吧。

前面的context.xml指quartz之类的有特性的任务加载器,后面则是各个任务的定义xml.
 ------------

下一步,就脱离标题了。跑题了。由于项目需求,定时跑报表,需要分离springbatchsample.如果把整个例子的工程提交出去,肯定会被剁成肉包子。。所以,将必须的分离出来,将没有用的例子剔除出去。

---

下一步,注意查看spring batch 中断点续传的特性,关注实现这类任务需要的类。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值