当前位置: 首页 > news >正文

Spring Batch

Spring Batch

请添加图片描述
Job instance(作业实例)
当作业运行时,会创建一个Job Instance(作业实例),它代表作业的一次逻辑运行,可通过作业名称与作业标识参数进行区分。
比如一个业务需求: 每天定期数据同步,作业名称-daily-sync-job 作业标记参数-当天时间
Job Execution(作业执行对象)
当作业运行时,也会创建一个Job Execution(作业执行器),负责记录Job执行情况(比如:开始执行时间,结束时间,处理状态等)。

Job Instance = Job名称 + 识别参数
Job Instance 一次执行创建一个 Job Execution对象
完整的一次Job Instance 执行可能创建一个Job Execution对象,也可能创建多个Job Execution对象

入门案例-H2版

导入依赖

<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.7.3</version><relativePath/>
</parent>
<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-batch</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency><!--内存版--><dependency><groupId>com.h2database</groupId><artifactId>h2</artifactId><scope>runtime</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId></dependency></dependencies>

测试方法

//之前使用@Component导致jobParameters获取失败
@Configuration
public class JobDemo1 {//作业启动器@Autowiredprivate JobLauncher jobLauncher;//Job构造工厂(构建job对象)@Autowiredprivate JobBuilderFactory jobBuilderFactory;//step构造工厂(构建step对象)@Autowiredprivate StepBuilderFactory stepBuilderFactory;//构造一个step对象执行的任务@Beanpublic Tasklet tasklet(){return new Tasklet() {@Overridepublic RepeatStatus execute(StepContribution stepContribution, ChunkContext chunkContext) throws Exception {//要执行逻辑  step步骤执行逻辑System.out.println("hello spring batch");return RepeatStatus.FINISHED;}};}//构造一个step对象@Beanpublic Step step1(){//tasklet指step执行逻辑return stepBuilderFactory.get("step1").tasklet(tasklet()).build();}//构造job对象//start(step1).next(step2)@Beanpublic Job job(){return jobBuilderFactory.get("hello-job").start(step1()).build();}
}

启动类

//启动springBatch
@EnableBatchProcessing
@SpringBootApplication
public class SpringbootApplication {public static void main(String[] args) {SpringApplication.run(SpringbootApplication.class, args);}
}

入门案例-MySQL版

依赖

 <!-- <dependency><groupId>com.h2database</groupId><artifactId>h2</artifactId><scope>runtime</scope>
</dependency> --><dependency><groupId>org.mariadb.jdbc</groupId><artifactId>mariadb-java-client</artifactId><version>2.7.2</version>
</dependency>

application-dev.yaml
此处测试时并没有自动创建表

server:port: 8896spring:datasource:username: rootpassword: rooturl: jdbc:mariadb://ip地址:3306/springbatch?serverTimezone=GMT%2B8&useSSL=false&allowPublicKeyRetrieval=truedriver-class-name: org.mariadb.jdbc.Driver# 初始化数据库,文件在依赖jar包中sql:init:schema-locations: classpath:org/springframework/batch/core/schema-mysql.sql#mode: alwaysmode: never

其余代码与H2版本相同

作业参数获取

在application中设置program arguments比如,name=zs
方案1:使用ChunkContext类
方案2:使用@Value 延时获取

//之前使用@Component导致jobParameters获取失败
@Configuration
public class JobDemo1 {//作业启动器@Autowiredprivate JobLauncher jobLauncher;//Job构造工厂(构建job对象)@Autowiredprivate JobBuilderFactory jobBuilderFactory;//step构造工厂(构建step对象)@Autowiredprivate StepBuilderFactory stepBuilderFactory;//构造一个step对象执行的任务@Beanpublic Tasklet tasklet(){return new Tasklet() {@Overridepublic RepeatStatus execute(StepContribution stepContribution, ChunkContext chunkContext) throws Exception {//方案1:使用ChunkContext类获取参数Map<String, Object> jobParameters = chunkContext.getStepContext().getJobParameters();System.out.println("job param name's value is "+jobParameters.get("name"));System.out.println("hello spring batch");return RepeatStatus.FINISHED;}};}//构造一个step对象执行的任务//@StepScope在启动项目的时候,不加载该Step步骤bean,等step1()被调用时才加载。这就是所谓延时获取@StepScope@Bean/方案2:使用@Value 延时获取public Tasklet tasklet2(@Value("#{jobParameters['name']}")String name){return new Tasklet() {@Overridepublic RepeatStatus execute(StepContribution stepContribution, ChunkContext chunkContext) throws Exception {//获取参数中设置的param的valueSystem.out.println("tasklet2: params---name is " + name);return RepeatStatus.FINISHED;}};}//构造一个step对象@Beanpublic Step step1(){//tasklet指step执行逻辑return stepBuilderFactory.get("step1").tasklet(tasklet()).build();}//构造一个step对象@Beanpublic Step step2(){//tasklet指step执行逻辑return stepBuilderFactory.get("step2").tasklet(tasklet2(null)).build();}//构造job对象//start(step1).next(step2)@Beanpublic Job job(){return jobBuilderFactory.get("param-job12").start(step1()).next(step2()).build();}
}

作业参数校验

定制参数校验器
JobParametersInvalidException 异常是Spring Batch 专门提供参数校验失败异常

public class NameParamValidator implements JobParametersValidator {@Overridepublic void validate(JobParameters parameters) throws JobParametersInvalidException {String name = parameters.getString("name");if(!StringUtils.hasText(name)){throw new JobParametersInvalidException("name 参数不能为空");}}
}

validator()实例方法,将定制的参数解析器加到Spring容器中,修改job()实例方法,加上.validator(validator()) 校验逻辑。

//之前使用@Component导致jobParameters获取失败
@Configuration
public class JobDemo2 {//作业启动器@Autowiredprivate JobLauncher jobLauncher;//Job构造工厂(构建job对象)@Autowiredprivate JobBuilderFactory jobBuilderFactory;//step构造工厂(构建step对象)@Autowiredprivate StepBuilderFactory stepBuilderFactory;//构造一个step对象执行的任务@Beanpublic Tasklet tasklet(){return new Tasklet() {@Overridepublic RepeatStatus execute(StepContribution stepContribution, ChunkContext chunkContext) throws Exception {//使用ChunkContext类获取参数Map<String, Object> jobParameters = chunkContext.getStepContext().getJobParameters();System.out.println("job param name's value is "+jobParameters.get("name"));System.out.println("hello spring batch");return RepeatStatus.FINISHED;}};}//构造一个step对象@Beanpublic Step step1(){//tasklet指step执行逻辑return stepBuilderFactory.get("step1").tasklet(tasklet()).build();}//注入自定义校验器@Beanpublic NameParamValidator nameParamValidator(){return new NameParamValidator();}//构造job对象//start(step1).next(step2)@Beanpublic Job job(){return jobBuilderFactory.get("param-valid").start(step1()).validator(nameParamValidator())//参数校验器.build();}
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • FPGA开发:Verilog数字设计基础
  • [论文笔记]QLoRA: Efficient Finetuning of Quantized LLMs
  • ios免签H5
  • tiptap parseHTML renderHTML 使用
  • 系统架构师考试学习笔记第三篇——架构设计高级知识(19)嵌入式系统架构设计理论与实践
  • 安卓下载工具箱_3.8.1/去浏览器跳转登录就是会员
  • 【一文读懂】NTN(非地面网络)技术介绍
  • vulhub GhostScript 沙箱绕过(CVE-2018-16509)
  • JS_循环结构
  • 【Python知识宝库】上下文管理器与with语句:资源管理的优雅方式
  • 归并排序/计数排序
  • Spring Boot之数据访问集成入门
  • 秋招想要过在线测评,这些知识必须刷
  • [SUCTF 2018]annonymous1
  • FFmpeg源码:avcodec_descriptor_get函数分析
  • $translatePartialLoader加载失败及解决方式
  • canvas 绘制双线技巧
  • es6--symbol
  • gulp 教程
  • 从零开始的无人驾驶 1
  • 搭建gitbook 和 访问权限认证
  • 大型网站性能监测、分析与优化常见问题QA
  • 对象管理器(defineProperty)学习笔记
  • 关于springcloud Gateway中的限流
  • 马上搞懂 GeoJSON
  • 排序算法之--选择排序
  • 前端设计模式
  • 看到一个关于网页设计的文章分享过来!大家看看!
  • ​Java并发新构件之Exchanger
  • #!/usr/bin/python与#!/usr/bin/env python的区别
  • #include到底该写在哪
  • #Spring-boot高级
  • #单片机(TB6600驱动42步进电机)
  • (02)Hive SQL编译成MapReduce任务的过程
  • (Java岗)秋招打卡!一本学历拿下美团、阿里、快手、米哈游offer
  • (安卓)跳转应用市场APP详情页的方式
  • (补充):java各种进制、原码、反码、补码和文本、图像、音频在计算机中的存储方式
  • (二)Pytorch快速搭建神经网络模型实现气温预测回归(代码+详细注解)
  • (一)UDP基本编程步骤
  • (游戏设计草稿) 《外卖员模拟器》 (3D 科幻 角色扮演 开放世界 AI VR)
  • (原創) 博客園正式支援VHDL語法著色功能 (SOC) (VHDL)
  • (转)Linux下编译安装log4cxx
  • (转)PlayerPrefs在Windows下存到哪里去了?
  • .net framwork4.6操作MySQL报错Character set ‘utf8mb3‘ is not supported 解决方法
  • .NET 使用配置文件
  • .NET 中创建支持集合初始化器的类型
  • .NET/C#⾯试题汇总系列:集合、异常、泛型、LINQ、委托、EF!(完整版)
  • @Bean注解详解
  • @ModelAttribute注解使用
  • []error LNK2001: unresolved external symbol _m
  • [Android]Tool-Systrace
  • [AS3]URLLoader+URLRequest+JPGEncoder实现BitmapData图片数据保存
  • [BZOJ1877][SDOI2009]晨跑[最大流+费用流]
  • [C# 开发技巧]实现属于自己的截图工具
  • [C#]winform基于opencvsharp结合Diffusion-Low-Light算法实现低光图像增强黑暗图片变亮变清晰