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:实体类对象

  1. /**
  2. * @author miaosj
  3. * @version 1.0
  4. * @date 2019/10/8
  5. */
  6. public class CreditBill {
  7. /**
  8. * 银行账户
  9. */
  10. private String accountID;
  11. /**
  12. * 账户名
  13. */
  14. private String name;
  15. /**
  16. * 消费金额
  17. */
  18. private double amount;
  19. /**
  20. * 消费日期
  21. */
  22. private String date;
  23. /**
  24. * 消费场所
  25. */
  26. private String address;
  27.  
  28. public String getAccountID() {
  29. return accountID;
  30. }
  31.  
  32. public void setAccountID(String accountID) {
  33. this.accountID = accountID;
  34. }
  35.  
  36. public String getName() {
  37. return name;
  38. }
  39.  
  40. public void setName(String name) {
  41. this.name = name;
  42. }
  43.  
  44. public double getAmount() {
  45. return amount;
  46. }
  47.  
  48. public void setAmount(double amount) {
  49. this.amount = amount;
  50. }
  51.  
  52. public String getDate() {
  53. return date;
  54. }
  55.  
  56. public void setDate(String date) {
  57. this.date = date;
  58. }
  59.  
  60. public String getAddress() {
  61. return address;
  62. }
  63.  
  64. public void setAddress(String address) {
  65. this.address = address;
  66. }
  67. }

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

  1. ,tom,100.00,-- ::,Lu Jia Zui road
  2. ,tom,320.00,-- ::,Lu Jia Zui road
  3. ,tom,674.00,-- ::,Lu Jia road
  4. ,tom,793.00,-- ::,Lu Jia Zui road
  5. ,tom,360.00,-- ::,Lu Jia Zui road
  6. ,tom,893.00,-- ::,Lu Jia Zui road

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

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

3.4、job.xml:定义job

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <bean:beans xmlns="http://www.springframework.org/schema/batch"
  3. xmlns:bean="http://www.springframework.org/schema/beans"
  4. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  5. xsi:schemaLocation="http://www.springframework.org/schema/beans
  6. http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
  7. http://www.springframework.org/schema/batch
  8. http://www.springframework.org/schema/batch/spring-batch-2.2.xsd">
  9. <!--引入job-context.xml配置文件-->
  10. <bean:import resource="classpath:job-context.xml"/>
  11. <!--定义billJob billStep 包含读数据 处理数据 写数据-->
  12. <job id="billJob">
  13. <step id="billStep">
  14. <tasklet transaction-manager="transactionManager">
  15. <!--commit-interval="2" 表示任务提交间隔的大小 此处表示每处理2条数据 进行一次写入操作-->
  16. <chunk reader="csvItemReader" writer="csvItemWriter" processor="creditBillProcessor" commit-interval="2">
  17. </chunk>
  18. </tasklet>
  19. </step>
  20. </job>
  21.  
  22. <!-- 读取信用卡账单文件,CSV格式 -->
  23. <bean:bean id="csvItemReader"
  24. class="org.springframework.batch.item.file.FlatFileItemReader"
  25. scope="step">
  26. <!--设置读取的文件资源-->
  27. <bean:property name="resource"
  28. value="classpath:data/credit-card-bill-201910.csv"/>
  29. <!--将文本中的每行记录转换为领域对象-->
  30. <bean:property name="lineMapper">
  31. <bean:bean class="org.springframework.batch.item.file.mapping.DefaultLineMapper">
  32. <!--引用lineTokenizer-->
  33. <bean:property name="lineTokenizer" ref="lineTokenizer"/>
  34. <!--fieldSetMapper根据lineTokenizer中定义的names属性映射到领域对象中去-->
  35. <bean:property name="fieldSetMapper">
  36. <bean:bean class="org.springframework.batch.item.file.mapping.BeanWrapperFieldSetMapper">
  37. <bean:property name="prototypeBeanName" value="creditBill">
  38. </bean:property>
  39. </bean:bean>
  40. </bean:property>
  41. </bean:bean>
  42. </bean:property>
  43. </bean:bean>
  44. <!-- lineTokenizer 定义文本中每行的分隔符号 以及每行映射成FieldSet对象后的name列表 -->
  45. <bean:bean id="lineTokenizer"
  46. class="org.springframework.batch.item.file.transform.DelimitedLineTokenizer">
  47. <bean:property name="delimiter" value=","/>
  48. <bean:property name="names">
  49. <bean:list>
  50. <bean:value>accountID</bean:value>
  51. <bean:value>name</bean:value>
  52. <bean:value>amount</bean:value>
  53. <bean:value>date</bean:value>
  54. <bean:value>address</bean:value>
  55. </bean:list>
  56. </bean:property>
  57. </bean:bean>
  58.  
  59. <!-- 写信用卡账单文件,CSV格式 -->
  60. <bean:bean id="csvItemWriter"
  61. class="org.springframework.batch.item.file.FlatFileItemWriter"
  62. scope="step">
  63. <!--<bean:property name="resource" value="file:target/data/outputFile.csv"/>-->
  64. <!--<bean:property name="resource" value="file:target/outputFile.csv"/>-->
  65. <bean:property name="resource" value="classpath:data/outputFile.csv"/>
  66. <bean:property name="lineAggregator">
  67. <bean:bean
  68. class="org.springframework.batch.item.file.transform.DelimitedLineAggregator">
  69. <bean:property name="delimiter" value=","></bean:property>
  70. <bean:property name="fieldExtractor">
  71. <bean:bean
  72. class="org.springframework.batch.item.file.transform.BeanWrapperFieldExtractor">
  73. <bean:property name="names" value="accountID,name,amount,date,address">
  74. </bean:property>
  75. </bean:bean>
  76. </bean:property>
  77. </bean:bean>
  78. </bean:property>
  79. </bean:bean>
  80. <!--领域对象 并标注为原型-->
  81. <bean:bean id="creditBill" scope="prototype"
  82. class="CreditBill">
  83. </bean:bean>
  84. <!--负责业务数据的处理-->
  85. <bean:bean id="creditBillProcessor" scope="step"
  86. class="CreditBillProcessor">
  87. </bean:bean>
  88. </bean:beans>

3.5、JobLaunch:java调用

  1. import org.springframework.batch.core.Job;
  2. import org.springframework.batch.core.JobExecution;
  3. import org.springframework.batch.core.JobParameters;
  4. import org.springframework.batch.core.launch.JobLauncher;
  5. import org.springframework.context.ApplicationContext;
  6. import org.springframework.context.support.ClassPathXmlApplicationContext;
  7.  
  8. /**
  9. * @author E101206
  10. * @version 1.0
  11. * @date 2019/10/8
  12. */
  13. public class JobLaunch {
  14. @SuppressWarnings("resource")
  15. public static void main(String[] args) {
  16. //初始化应用上下文
  17. ApplicationContext context = new ClassPathXmlApplicationContext("job/job.xml");
  18. //获取作业调度,根据Bean的名称从Spring的上下文获取
  19. JobLauncher launcher = (JobLauncher) context.getBean("jobLauncher");
  20. //获取任务对象
  21. Job job = (Job) context.getBean("billJob");
  22. try {
  23. JobExecution result = launcher.run(job, new JobParameters());
  24. System.out.println(result.toString());
  25. } catch (Exception e) {
  26. e.printStackTrace();
  27. }
  28. }
  29. }

3.6、JobLaunchTest:单位测试

  1. /**
  2. * @author E101206
  3. * @version 1.0
  4. * @date 2019/10/8
  5. */
  6. import org.junit.After;
  7. import org.junit.Before;
  8. import org.junit.Test;
  9. import org.junit.runner.RunWith;
  10. import org.springframework.batch.core.Job;
  11. import org.springframework.batch.core.JobExecution;
  12. import org.springframework.batch.core.JobParameters;
  13. import org.springframework.batch.core.launch.JobLauncher;
  14. import org.springframework.beans.factory.annotation.Autowired;
  15. import org.springframework.beans.factory.annotation.Qualifier;
  16. import org.springframework.test.context.ContextConfiguration;
  17. import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
  18.  
  19. @RunWith(SpringJUnit4ClassRunner.class)
  20. @ContextConfiguration(locations={"/job/job.xml"})
  21. public class JobLaunchTest {
  22. @Autowired
  23. private JobLauncher jobLauncher;
  24.  
  25. @Autowired@Qualifier("billJob")
  26. private Job job;
  27.  
  28. @Before
  29. public void setUp() throws Exception {
  30. }
  31.  
  32. @After
  33. public void tearDown() throws Exception {
  34. }
  35.  
  36. @Test
  37. public void billJob() throws Exception {
  38. JobExecution result = jobLauncher.run(job, new JobParameters());
  39. System.out.println(result.toString());
  40. }
  41. }

3.7、pom.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5. <modelVersion>4.0.0</modelVersion>
  6.  
  7. <groupId>com.msj</groupId>
  8. <artifactId>spring-batch-example</artifactId>
  9. <version>1.0-SNAPSHOT</version>
  10.  
  11. <properties>
  12. <jdk.version>1.8</jdk.version>
  13. <spring.version>4.3.8.RELEASE</spring.version>
  14. <spring.batch.version>3.0.7.RELEASE</spring.batch.version>
  15. <junit.version>4.11</junit.version>
  16. </properties>
  17.  
  18. <build>
  19. <plugins>
  20. <plugin>
  21. <groupId>org.apache.maven.plugins</groupId>
  22. <artifactId>maven-compiler-plugin</artifactId>
  23. <configuration>
  24. <source>${jdk.version}</source>
  25. <target>${jdk.version}</target>
  26. </configuration>
  27. </plugin>
  28. </plugins>
  29. </build>
  30. <dependencies>
  31. <!--&lt;!&ndash; Spring Core &ndash;&gt;-->
  32. <!--<dependency>-->
  33. <!--<groupId>org.springframework</groupId>-->
  34. <!--<artifactId>spring-core</artifactId>-->
  35. <!--<version>${spring.version}</version>-->
  36. <!--</dependency>-->
  37.  
  38. <!--&lt;!&ndash; Spring jdbc, for database &ndash;&gt;-->
  39. <!--<dependency>-->
  40. <!--<groupId>org.springframework</groupId>-->
  41. <!--<artifactId>spring-jdbc</artifactId>-->
  42. <!--<version>${spring.version}</version>-->
  43. <!--</dependency>-->
  44.  
  45. <!--&lt;!&ndash; Spring XML to/back object &ndash;&gt;-->
  46. <!--<dependency>-->
  47. <!--<groupId>org.springframework</groupId>-->
  48. <!--<artifactId>spring-oxm</artifactId>-->
  49. <!--<version>${spring.version}</version>-->
  50. <!--</dependency>-->
  51.  
  52. <!-- Spring Batch dependencies -->
  53. <dependency>
  54. <groupId>org.springframework.batch</groupId>
  55. <artifactId>spring-batch-core</artifactId>
  56. <version>${spring.batch.version}</version>
  57. </dependency>
  58.  
  59. <!--<dependency>-->
  60. <!--<groupId>org.springframework.batch</groupId>-->
  61. <!--<artifactId>spring-batch-infrastructure</artifactId>-->
  62. <!--<version>${spring.batch.version}</version>-->
  63. <!--</dependency>-->
  64.  
  65. <!-- Spring Batch unit test -->
  66. <dependency>
  67. <groupId>org.springframework.batch</groupId>
  68. <artifactId>spring-batch-test</artifactId>
  69. <version>${spring.batch.version}</version>
  70. </dependency>
  71.  
  72. <!-- Junit -->
  73. <dependency>
  74. <groupId>junit</groupId>
  75. <artifactId>junit</artifactId>
  76. <version>${junit.version}</version>
  77. <scope>test</scope>
  78. </dependency>
  79.  
  80. </dependencies>
  81. </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批量写入数据源

SpringBatch批处理框架:入门项目的更多相关文章

  1. SpringBatch批处理框架

    1.前言:本博客是对于刘相SpringBatch批处理框架的学习 1.1.参考网站:https://docs.spring.io/spring-batch/4.2.x/reference/html/i ...

  2. spring-batch批处理框架

    转自 http://www.cnblogs.com/gulvzhe/archive/2011/10/21/2220260.html 这个框架没有实际操作,只是从同事处学习到,先转个好文章,以后有机会再 ...

  3. 通过例子讲解Spring Batch入门,优秀的批处理框架

    1 前言 欢迎访问南瓜慢说 www.pkslow.com获取更多精彩文章! Spring相关文章:Springboot-Cloud相关 Spring Batch是一个轻量级的.完善的批处理框架,作为S ...

  4. ThinkJS框架入门详细教程(二)新手入门项目

    一.准备工作 参考前一篇:ThinkJS框架入门详细教程(一)开发环境 安装thinkJS命令 npm install -g think-cli 监测是否安装成功 thinkjs -v 二.创建项目 ...

  5. SpringMVC框架入门配置 IDEA下搭建Maven项目(zz)

    SpringMVC框架入门配置 IDEA下搭建Maven项目 这个不错哦 http://www.cnblogs.com/qixiaoyizhan/p/5819392.html

  6. Newbe.Claptrap 框架入门,第二步 —— 创建项目

    接上一篇 Newbe.Claptrap 框架入门,第一步 -- 开发环境准备 ,我们继续了解如何创建一个 Newbe.Claptrap 项目. Newbe.Claptrap 是一个用于轻松应对并发问题 ...

  7. Taurus.MVC 微服务框架 入门开发教程:项目部署:1、微服务应用程序常规部署实现多开,节点扩容。

    系列目录: 本系列分为项目集成.项目部署.架构演进三个方向,后续会根据情况调整文章目录. 本系列第一篇:Taurus.MVC V3.0.3 微服务开源框架发布:让.NET 架构在大并发的演进过程更简单 ...

  8. Taurus.MVC 微服务框架 入门开发教程:项目部署:2、让Kestrel支持绑定多个域名转发,替代Ngnix使用。

    系列目录: 本系列分为项目集成.项目部署.架构演进三个方向,后续会根据情况调整文章目录. 本系列第一篇:Taurus.MVC V3.0.3 微服务开源框架发布:让.NET 架构在大并发的演进过程更简单 ...

  9. Taurus.MVC 微服务框架 入门开发教程:项目部署:3、微服务应用程序版本升级:全站升级和局部模块升级。

    系列目录: 本系列分为项目集成.项目部署.架构演进三个方向,后续会根据情况调整文章目录. 本系列第一篇:Taurus.MVC V3.0.3 微服务开源框架发布:让.NET 架构在大并发的演进过程更简单 ...

随机推荐

  1. vue-router 使用二级路由去实现子组件的显示和隐藏

    在需求中有一个这样的情况:一个组件在主组件和另外的组件中引用,且点击主组件和这个组件分别有相应得切换事件. 一开始的时候我是没有划分组件,把它们放到主组件内,这样便于切换,但是主主件内有独立的部分需要 ...

  2. 浅谈fetch

    在开发过程中,我们向服务端发送请求,一般会使用三种方式, XMLHttpRequest(XHR),jQuery实现的AJAX,Fetch ,让我们首先来比较一下这三者的使用示例. XMLHttpReq ...

  3. 22-4-isarry

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  4. ARM TK1 安装kinect驱动

    首先安装usb库 $ git clone https://github.com/libusb/libusb.git 编译libusb需要的工具 $ sudo apt-get install autoc ...

  5. netstat -pa --unix >>test.txt

    netstat -pa --unix >>test.txt 输出套接字 命名socket信息

  6. SOCK_SEQPACKE

    The SOCK_SEQPACKET socket type is similar to the SOCK_STREAM type, and is also connection-oriented. ...

  7. Spring Cloud (Spring Cloud Stream)解析

    执行脚本目录 /bin windows 在其单独的目录 快速上手 下载并且解压kafka压缩包 运行服务 以Windows为例,首先打开cmd: 1.  启动zookeeper: bin\window ...

  8. Kotlin Download

    { https://github.com/JetBrains/kotlin/releases/tag/v1.3.50 }

  9. Go Mixed 变量声明

    Go Mixed 变量声明 package main import "fmt" func main() { var a, b, c = 3, 4, "foo" ...

  10. 【Tomcat】Tomcat调优

    Tomcat的默认配置,性能并不是最优的,我们可以通过优化tomcat以此来提高网站的并发能力.提高Tomcat的性能可以分为两个方向. 服务器资源 服务器所能提供CPU.内存.硬盘的性能对处理能力有 ...