餐饮小程序开发,网站建设优化哪家公司好,自己买个服务器有什么用,四种常用的erp软件目录 文档基础概念Tasklet方式示例Chunk方式示例参考文章 文档
https://docs.spring.io/spring-batch/docs/4.3.9/reference/html/index.html
基础概念
JobLauncher#xff1a;作业启动器#xff0c;启动作业的入口。对应的实现类为SimpleJobLauncher。Job#xff1a;作业… 目录 文档基础概念Tasklet方式示例Chunk方式示例参考文章 文档
https://docs.spring.io/spring-batch/docs/4.3.9/reference/html/index.html
基础概念
JobLauncher作业启动器启动作业的入口。对应的实现类为SimpleJobLauncher。Job作业用于配置作业的相关配置一个作业可以配置多个步骤步骤之间是有序的。Step步骤作业具体执行的业务逻辑一个Job可以配置多个Step。步骤有两种实现方式 Tasklet方式所有作业逻辑写在一个方法中。Chunk方式将一个完整的作业逻辑根据作用拆分到三个方法中 ItemReader负责从数据源中读数据如从文件、数据库等。ItemProcessor 负责对读出来的数据进行非法校验和对数据进行加工。ItemWriter将数据写到某个目标中如文件、数据库等。 JobBuilderFactory作业构建起工厂用于构建作业Job对象。 get(String name)设置作业名称。start(Step step)设置作业启动的第一个步骤。build()构建Job对象。 StepBuilderFactory作业构建器工厂用于构造步骤Step对象。 get(String name)设置步骤名称。tasklet(Tasklet tasklet)设置Tasklet。build()构建Step对象。 JobRepository作业持久化在执行作业的过程中用于操作spring batch相关的表记录作业的相关状态等。
Tasklet方式示例
运行环境
$ java -version
java version 1.8.0_361
Java(TM) SE Runtime Environment (build 1.8.0_361-b09)
Java HotSpot(TM) 64-Bit Server VM (build 25.361-b09, mixed mode)spring-batch依赖
!-- spring-batch --
dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-batch/artifactId
/dependencydependencygroupIdorg.springframework.batch/groupIdartifactIdspring-batch-test/artifactIdscopetest/scope
/dependency!-- h2、mysql... --
dependencygroupIdcom.h2database/groupIdartifactIdh2/artifactIdscoperuntime/scope
/dependency备注第一次照着网上的文章写代码运行直接报错原因是缺少引入的依赖需要引入数据库驱动如H2或mysql 项目结构
$ tree
.
├── pom.xml
└── src└── main├── java│ └── com│ └── example│ └── demo│ ├── HelloWorldApplication.java│ ├── config│ │ └── BatchConfig.java│ └── task│ └── HelloWorldTasklet.java└── resources
完整依赖pom.xml
?xml version1.0 encodingUTF-8?
project xmlnshttp://maven.apache.org/POM/4.0.0 xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsdmodelVersion4.0.0/modelVersionparentgroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-parent/artifactIdversion2.7.7/versionrelativePath/ !-- lookup parent from repository --/parentgroupIdcom.example/groupIdartifactIddemo/artifactIdversion0.0.1-SNAPSHOT/versionnamedemo/namedescriptionDemo project for Spring Boot/descriptionpropertiesjava.version1.8/java.versionmybatis-plus.version3.5.2/mybatis-plus.version/propertiesdependenciesdependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-devtools/artifactIdscoperuntime/scopeoptionaltrue/optional/dependencydependencygroupIdorg.projectlombok/groupIdartifactIdlombok/artifactIdoptionaltrue/optional/dependency!-- spring-batch --dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-batch/artifactId/dependencydependencygroupIdorg.springframework.batch/groupIdartifactIdspring-batch-test/artifactIdscopetest/scope/dependencydependencygroupIdcom.h2database/groupIdartifactIdh2/artifactIdscoperuntime/scope/dependency!-- test --dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-test/artifactIdscopetest/scope/dependencydependencygroupIdjunit/groupIdartifactIdjunit/artifactIdscopetest/scope/dependency/dependenciesbuildpluginsplugingroupIdorg.springframework.boot/groupIdartifactIdspring-boot-maven-plugin/artifactIdconfigurationexcludesexcludegroupIdorg.projectlombok/groupIdartifactIdlombok/artifactId/exclude/excludes/configuration/plugin/plugins/build/project
编写业务逻辑
package com.example.demo.task;import org.springframework.batch.core.StepContribution;
import org.springframework.batch.core.scope.context.ChunkContext;
import org.springframework.batch.core.step.tasklet.Tasklet;
import org.springframework.batch.repeat.RepeatStatus;
import org.springframework.stereotype.Component;/*** 任务*/
Component
public class HelloWorldTasklet implements Tasklet {Overridepublic RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception {System.out.println(Hello, World!);return RepeatStatus.FINISHED;}
}
配置作业步骤
package com.example.demo.config;import com.example.demo.task.HelloWorldTasklet;
import org.springframework.batch.core.Job;
import org.springframework.batch.core.Step;
import org.springframework.batch.core.configuration.annotation.JobBuilderFactory;
import org.springframework.batch.core.configuration.annotation.StepBuilderFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;/*** Spring Batch配置*/
Configuration
public class BatchConfig {Autowiredprivate JobBuilderFactory jobBuilderFactory;Autowiredprivate StepBuilderFactory stepBuilderFactory;Autowiredprivate HelloWorldTasklet helloWorldTasklet;Beanpublic Step step() {return this.stepBuilderFactory.get(step).tasklet(helloWorldTasklet).build();}Beanpublic Job job(Step step) {return this.jobBuilderFactory.get(job).start(step).build();}
}
启动类增加注解EnableBatchProcessing
package com.example.demo;import org.springframework.batch.core.configuration.annotation.EnableBatchProcessing;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;EnableBatchProcessing
SpringBootApplication
public class HelloWorldApplication {public static void main(String[] args) {SpringApplication.run(HelloWorldApplication.class, args);}}
Chunk方式示例
项目结构
$ tree
.
├── pom.xml
└── src└── main├── java│ └── com│ └── example│ └── demo│ ├── Application.java│ ├── config│ │ └── BatchConfig.java│ ├── dto│ │ └── Person.java│ └── processor│ └── PersonItemProcessor.java└── resources└── persons.csv
依赖pom.xml 同上
package com.example.demo.dto;import lombok.Data;Data
public class Person {private String name;private Integer age;
}
package com.example.demo.config;import com.example.demo.dto.Person;
import com.example.demo.processor.PersonItemProcessor;
import org.springframework.batch.core.Job;
import org.springframework.batch.core.Step;
import org.springframework.batch.core.configuration.annotation.JobBuilderFactory;
import org.springframework.batch.core.configuration.annotation.StepBuilderFactory;
import org.springframework.batch.item.file.FlatFileItemReader;
import org.springframework.batch.item.file.builder.FlatFileItemReaderBuilder;
import org.springframework.batch.item.json.JacksonJsonObjectMarshaller;
import org.springframework.batch.item.json.JsonFileItemWriter;
import org.springframework.batch.item.json.builder.JsonFileItemWriterBuilder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.FileSystemResource;/*** Spring Batch配置*/
Configuration
public class BatchConfig {Autowiredprivate JobBuilderFactory jobBuilderFactory;Autowiredprivate StepBuilderFactory stepBuilderFactory;Beanpublic Step step() {return this.stepBuilderFactory.get(step).Person, Personchunk(10).reader(reader()).processor(processor()).writer(writer()).build();}Beanpublic Job job(Step step) {return this.jobBuilderFactory.get(job).start(step).build();}/*** 读取csv文件* return*/Beanpublic FlatFileItemReaderPerson reader() {return new FlatFileItemReaderBuilderPerson().name(personItemReader).resource(new ClassPathResource(persons.csv)).delimited().names(new String[] {name, age}).targetType(Person.class).build();}/*** 处理器* return*/Beanpublic PersonItemProcessor processor() {return new PersonItemProcessor();}/*** 写到json文件* return*/Beanpublic JsonFileItemWriterPerson writer() {return new JsonFileItemWriterBuilderPerson().jsonObjectMarshaller(new JacksonJsonObjectMarshaller()).resource(new FileSystemResource(persons.json)).name(personItemWriter).build();}}
package com.example.demo.processor;import com.example.demo.dto.Person;
import org.springframework.batch.item.ItemProcessor;public class PersonItemProcessor implements ItemProcessorPerson, Person {Overridepublic Person process(Person person) throws Exception {// 为每个对象年龄1person.setAge(person.getAge() 1);return person;}
}
启动入口
package com.example.demo;import org.springframework.batch.core.configuration.annotation.EnableBatchProcessing;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;EnableBatchProcessing
SpringBootApplication
public class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);}}
启动SpringBoot即可运行任务
读取的persons.csv文件
Tom,18
Jack,20
生成的persons.json 文件
[{name:Tom,age:19},{name:Jack,age:21}
]参考文章
SpringBatch从入门到实战(二)HelloWorldSpring Batch 之 Hello WorldSpring Batch 入门级示例教程Spring Batch 批处理框架优化实践效率嘎嘎高