Spring Batch学习笔记(一)
程序员文章站
2022-03-30 11:30:04
Spring Batch简介 Spring Batch提供了可重复使用的功能,用来处理大量数据。包括记录、跟踪,事务管理,作业处理统计,作业重启,跳过和资源管理。 此外还提供了更高级的技术服务和功能,通过优化和分区技术实现极高容量和高性能的批处理作业。 Spring Batch使用场景 (1)一般的 ......
spring batch简介
spring batch提供了可重复使用的功能,用来处理大量数据。包括记录、跟踪,事务管理,作业处理统计,作业重启,跳过和资源管理。 此外还提供了更高级的技术服务和功能,通过优化和分区技术实现极高容量和高性能的批处理作业。
spring batch使用场景
(1)一般的批处理程序
·从数据库,文件或者队列中读取大量数据
·处理读取到的数据
·将处理完成的数据保存到文件,数据库
(2)业务场景
·定期提交批处理
·并发批处理,并行处理job
·分阶段的企业消息驱动处理
·大规模并行批处理
·失败后手动或预定重启
·依赖步骤的顺序处理
·部分处理,跳过记录
·整批交易,适用于批量较小或现有存储过程/脚本的情况
spring batch主要组成部分
·jobrepository,用来注册job的容器 ·joblauncher,用来启动job的接口 ·job,实际执行的任务,包含一个或多个step ·step,step包含itemreader、itemprocessor和itemwriter ·itemreader,用来读取数据的接口 ·itemprocessor,用来处理数据的接口 ·itemwriter,用来输出数据的接口 以上spring batch的主要组成部分只需要注册成spring的bean即可。批处理的配置类上需要使用@enabelbatchprocessing。
代码
(1)监听器joblistener
@component public class joblistener implements jobexecutionlistener{ @override public void beforejob(jobexecution jobexecution){ // job执行前需要执行的操作 } @override public void afterjob(jobexecution jobexecution){ // job执行完成后需要执行的操作 } }
(2)配置类databatchconfiguration
@configuration @enablebatchprocessing public class databatchconfiguration{ // 用于构建job @resource private jobbuilderfactory jobbuilderfactory; // 用于构建step @resource private stepbuilderfactory stepbuilderfactory; // 监听器 @resource private joblistener joblistener; // itemreader(使用的其中一种读取方式) @autowired private repositoryitemreader readerdata; // itemwriter @autowired private itemreader writerdata; // job @bean public job datahandlejob(){ return jobbuilderfactory.get("datahandlejob").incrementer(new runidincrementer()).start(getdatastep()) .listener(joblistener).build(); } // step // user:要处理的对象 @bean public step gettdistsellout() { return stepbuilderfactory.get("getdata").<user, user>chunk(10000) // 一次commit数据的数量 .faulttolerant().retrylimit(3) .retry(exception.class) .skiplimit(100) // 发生异常时,允许重试的次数 .skip(exception.class) .reader(readerdata) // reader .writer(writerdata).build(); // writer } }
(3)读取类readerstep
@component public class readerstep{ @resource private entitymanagerfactory emf; @autowired private userrepository userrepository; @bean repositoryitemreader<user> readerdata(){ // 排序map(读取数据按照id进行正序排列) map<string,sort.direction> map = new hashmap<>(); map.put("id",sort.direction.asc); // sql语句所需参数list list<string> params = new arraylist<>(); params.add("2019-03-20"); repositoryitemreader<user> repositoryitemreader = new new repositoryitemreader<>(); // set repository repositoryitemreader.setrepository(userrepository); // set pagesize(没有会报错) repositoryitemreader.setpagesize(5); // set repository method repositoryitemreader.setmethodname("findbydatelike"); // set 参数list repositoryitemreader.setarguments(params); // set 排序map repositoryitemreader.setsort(map); return repositoryitemreader; } }
(4)写出类writerstep
@component public class writerstep { @resource private userrepository userrepository; @bean public repositoryitemwriter<user> writerdata(){ repositoryitemwriter<user> repositoryitemwriter = new repositoryitemwriter<>(); repositoryitemwriter.setrepository(userrepository); repositoryitemwriter.setmethodname("save"); return repositoryitemwriter; } }
参考网址
https://www.cnblogs.com/ealenxie/p/9647703.html