1、项目结构如下:

aaarticlea/png;base64,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" alt="" />

2、文件说明:

2.1、CreditBill:表示信用卡消费记录领域对象

2.2、CreditBillProcessor:记录处理类,本场景仅打印信息

2.3、credit-card-bill-201910.csv:原始账单数据

2.4、job.xml:作业定义文件

2.5、job-context.xml :Spring Batch 批处理任务需要的基础信息

2.6、JobLaunch:调用批处理作业类

2.7、JobLaunchTest:Junit单元测试类,使用Spring提供的测试框架类。

2.8、pom.xml:引用相关jar包

3、文件内容:

3.1、CreditBill:实体类对象

/**
* @author miaosj
* @version 1.0
* @date 2019/10/8
*/
public class CreditBill {
/**
* 银行账户
*/
private String accountID;
/**
* 账户名
*/
private String name;
/**
* 消费金额
*/
private double amount;
/**
* 消费日期
*/
private String date;
/**
* 消费场所
*/
private String address; public String getAccountID() {
return accountID;
} public void setAccountID(String accountID) {
this.accountID = accountID;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public double getAmount() {
return amount;
} public void setAmount(double amount) {
this.amount = amount;
} public String getDate() {
return date;
} public void setDate(String date) {
this.date = date;
} public String getAddress() {
return address;
} public void setAddress(String address) {
this.address = address;
}
}

3.2、credit-card-bill-201910.csv:原始账单数据

,tom,100.00,-- ::,Lu Jia Zui road
,tom,320.00,-- ::,Lu Jia Zui road
,tom,674.00,-- ::,Lu Jia road
,tom,793.00,-- ::,Lu Jia Zui road
,tom,360.00,-- ::,Lu Jia Zui road
,tom,893.00,-- ::,Lu Jia Zui road

3.3、job-context.xml:job基础设施

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"
default-autowire="byName">
<!--定义作业仓库SpringBatch提供了两种作业仓库来记录job执行期产生的信息:一种是内存,另一种是数据库,此处采用内存-->
<bean id="jobRepository"
class="org.springframework.batch.core.repository.support.MapJobRepositoryFactoryBean">
</bean>
<!--定义作业调度器,用来启动Job -->
<bean id="jobLauncher"
class="org.springframework.batch.core.launch.support.SimpleJobLauncher">
<property name="jobRepository" ref="jobRepository"/>
</bean>
<!--事务管理器,用于springbatch框架在对数据操作过程中体统事务能力-->
<bean id="transactionManager"
class="org.springframework.batch.support.transaction.ResourcelessTransactionManager"/>
</beans>

3.4、job.xml:定义job

<?xml version="1.0" encoding="UTF-8"?>
<bean:beans xmlns="http://www.springframework.org/schema/batch"
xmlns:bean="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/batch
http://www.springframework.org/schema/batch/spring-batch-2.2.xsd">
<!--引入job-context.xml配置文件-->
<bean:import resource="classpath:job-context.xml"/>
<!--定义billJob billStep 包含读数据 处理数据 写数据-->
<job id="billJob">
<step id="billStep">
<tasklet transaction-manager="transactionManager">
<!--commit-interval="2" 表示任务提交间隔的大小 此处表示每处理2条数据 进行一次写入操作-->
<chunk reader="csvItemReader" writer="csvItemWriter" processor="creditBillProcessor" commit-interval="2">
</chunk>
</tasklet>
</step>
</job> <!-- 读取信用卡账单文件,CSV格式 -->
<bean:bean id="csvItemReader"
class="org.springframework.batch.item.file.FlatFileItemReader"
scope="step">
<!--设置读取的文件资源-->
<bean:property name="resource"
value="classpath:data/credit-card-bill-201910.csv"/>
<!--将文本中的每行记录转换为领域对象-->
<bean:property name="lineMapper">
<bean:bean class="org.springframework.batch.item.file.mapping.DefaultLineMapper">
<!--引用lineTokenizer-->
<bean:property name="lineTokenizer" ref="lineTokenizer"/>
<!--fieldSetMapper根据lineTokenizer中定义的names属性映射到领域对象中去-->
<bean:property name="fieldSetMapper">
<bean:bean class="org.springframework.batch.item.file.mapping.BeanWrapperFieldSetMapper">
<bean:property name="prototypeBeanName" value="creditBill">
</bean:property>
</bean:bean>
</bean:property>
</bean:bean>
</bean:property>
</bean:bean>
<!-- lineTokenizer 定义文本中每行的分隔符号 以及每行映射成FieldSet对象后的name列表 -->
<bean:bean id="lineTokenizer"
class="org.springframework.batch.item.file.transform.DelimitedLineTokenizer">
<bean:property name="delimiter" value=","/>
<bean:property name="names">
<bean:list>
<bean:value>accountID</bean:value>
<bean:value>name</bean:value>
<bean:value>amount</bean:value>
<bean:value>date</bean:value>
<bean:value>address</bean:value>
</bean:list>
</bean:property>
</bean:bean> <!-- 写信用卡账单文件,CSV格式 -->
<bean:bean id="csvItemWriter"
class="org.springframework.batch.item.file.FlatFileItemWriter"
scope="step">
<!--<bean:property name="resource" value="file:target/data/outputFile.csv"/>-->
<!--<bean:property name="resource" value="file:target/outputFile.csv"/>-->
<bean:property name="resource" value="classpath:data/outputFile.csv"/>
<bean:property name="lineAggregator">
<bean:bean
class="org.springframework.batch.item.file.transform.DelimitedLineAggregator">
<bean:property name="delimiter" value=","></bean:property>
<bean:property name="fieldExtractor">
<bean:bean
class="org.springframework.batch.item.file.transform.BeanWrapperFieldExtractor">
<bean:property name="names" value="accountID,name,amount,date,address">
</bean:property>
</bean:bean>
</bean:property>
</bean:bean>
</bean:property>
</bean:bean>
<!--领域对象 并标注为原型-->
<bean:bean id="creditBill" scope="prototype"
class="CreditBill">
</bean:bean>
<!--负责业务数据的处理-->
<bean:bean id="creditBillProcessor" scope="step"
class="CreditBillProcessor">
</bean:bean>
</bean:beans>

3.5、JobLaunch:java调用

import org.springframework.batch.core.Job;
import org.springframework.batch.core.JobExecution;
import org.springframework.batch.core.JobParameters;
import org.springframework.batch.core.launch.JobLauncher;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext; /**
* @author E101206
* @version 1.0
* @date 2019/10/8
*/
public class JobLaunch {
@SuppressWarnings("resource")
public static void main(String[] args) {
//初始化应用上下文
ApplicationContext context = new ClassPathXmlApplicationContext("job/job.xml");
//获取作业调度,根据Bean的名称从Spring的上下文获取
JobLauncher launcher = (JobLauncher) context.getBean("jobLauncher");
//获取任务对象
Job job = (Job) context.getBean("billJob");
try {
JobExecution result = launcher.run(job, new JobParameters());
System.out.println(result.toString());
} catch (Exception e) {
e.printStackTrace();
}
}
}

3.6、JobLaunchTest:单位测试

/**
* @author E101206
* @version 1.0
* @date 2019/10/8
*/
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.batch.core.Job;
import org.springframework.batch.core.JobExecution;
import org.springframework.batch.core.JobParameters;
import org.springframework.batch.core.launch.JobLauncher;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; @RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"/job/job.xml"})
public class JobLaunchTest {
@Autowired
private JobLauncher jobLauncher; @Autowired@Qualifier("billJob")
private Job job; @Before
public void setUp() throws Exception {
} @After
public void tearDown() throws Exception {
} @Test
public void billJob() throws Exception {
JobExecution result = jobLauncher.run(job, new JobParameters());
System.out.println(result.toString());
}
}

3.7、pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion> <groupId>com.msj</groupId>
<artifactId>spring-batch-example</artifactId>
<version>1.0-SNAPSHOT</version> <properties>
<jdk.version>1.8</jdk.version>
<spring.version>4.3.8.RELEASE</spring.version>
<spring.batch.version>3.0.7.RELEASE</spring.batch.version>
<junit.version>4.11</junit.version>
</properties> <build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>${jdk.version}</source>
<target>${jdk.version}</target>
</configuration>
</plugin>
</plugins>
</build>
<dependencies>
<!--&lt;!&ndash; Spring Core &ndash;&gt;-->
<!--<dependency>-->
<!--<groupId>org.springframework</groupId>-->
<!--<artifactId>spring-core</artifactId>-->
<!--<version>${spring.version}</version>-->
<!--</dependency>--> <!--&lt;!&ndash; Spring jdbc, for database &ndash;&gt;-->
<!--<dependency>-->
<!--<groupId>org.springframework</groupId>-->
<!--<artifactId>spring-jdbc</artifactId>-->
<!--<version>${spring.version}</version>-->
<!--</dependency>--> <!--&lt;!&ndash; Spring XML to/back object &ndash;&gt;-->
<!--<dependency>-->
<!--<groupId>org.springframework</groupId>-->
<!--<artifactId>spring-oxm</artifactId>-->
<!--<version>${spring.version}</version>-->
<!--</dependency>--> <!-- Spring Batch dependencies -->
<dependency>
<groupId>org.springframework.batch</groupId>
<artifactId>spring-batch-core</artifactId>
<version>${spring.batch.version}</version>
</dependency> <!--<dependency>-->
<!--<groupId>org.springframework.batch</groupId>-->
<!--<artifactId>spring-batch-infrastructure</artifactId>-->
<!--<version>${spring.batch.version}</version>-->
<!--</dependency>--> <!-- Spring Batch unit test -->
<dependency>
<groupId>org.springframework.batch</groupId>
<artifactId>spring-batch-test</artifactId>
<version>${spring.batch.version}</version>
</dependency> <!-- Junit -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency> </dependencies>
</project>

4、概念

4.1、Job Repository:作业仓库,负责job、step执行过程中的状态保存

4.2、Job launcher:作业调度器,提供执行job的入口

4.3、Job:作业,由多个step组成,封装整个批处理操作

4.4、Step:作业步,job的一个执行环节

4.5、Tasklet:Step中具体执行逻辑的操作,可以重复执行,可以设置具体的同步、异步操作

4.6、Chunk:给定数量的Item的集合,可以定义对Chunk读操作、处理操作、写操作,提交间隔等

4.7、Item:一条记录

4.8、ItemReader:从数据源读取Item

4.9、ItemProcessor:在Item写入数据源之前,对数据进行处理如:数据清洗,数据转换,数据过滤、数据校验等

4.10、ItemWriter:将Item批量写入数据源

最新文章

  1. Func与Action
  2. iOS 图形图像动画 Core Animation
  3. Netflix Falcor获取JSON数据
  4. 序列化和反序列化,异步调用web/wcf/函数
  5. responsive design
  6. FireFox浏览器的下载和安装、借助RamDisk让你的FireFox飞起来
  7. Oracle 11g RAC 环境下单实例非缺省监听及端口配置
  8. HashMap的存储原理
  9. 【RL-TCPnet网络教程】第37章 RL-TCPnet之FTP客户端
  10. KAFKA跨主机部署网络不通解决思路
  11. 初略 异步IO
  12. 【LeetCode每天一题】Jump Game(跳跃游戏)
  13. android recovery 升级之USB设备挂载
  14. Android学习之基础知识五—RecyclerView(滚动控件)
  15. BZOJ3817 清华集训2014 Sum 类欧几里得
  16. tomcat监控脚本(监控进程,测试接口,告警动作为发送邮件)
  17. Java Jackson - Json Polymorphism
  18. PHP:第一章——PHP中静态变量和常量
  19. 框架流程图绘制工具OmniGraffle 7 for Mac
  20. 表单input中disabled提交后得不到值的解决办

热门文章

  1. 37-Ubuntu-用户管理-02-查看用户信息
  2. 原型对象(JS中的父类)
  3. 如何实现qq消息轰炸
  4. nacos注册中心配置命名服务不生效问题
  5. 如何配置vue-cli4.0
  6. PHP headers_list() 函数
  7. 思维题+贪心——牛客多校第一场C
  8. delphi透明panel组件或者制作方法
  9. NX二次开发-设置WCS显示UF_CSYS_set_wcs_display
  10. Spring声明式事务的实现方式选择(JDK动态代理与cglib)