欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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