springbatch

job的创建使用

  • job:作业,是批处理中的核心概念,是batch操作的基础单元,每个job由多个step组成

  • step:步骤,任务完成的节点

  • 每个job是由JobBuildFactory创建,每个step是由StepBuildFactory创建

  • 示例:

    ``

    @Configuration

    @EnableBatchProcessing //开启批处理

    public class JobConfiguration {

        /**
    * 创建任务对象的对象
    */
    @Autowired
    private JobBuilderFactory jobBuilderFactory; /**
    * 创建步骤对象的对象
    */
    @Autowired
    private StepBuilderFactory stepBuilderFactory; @Bean
    public Job helloJob(){ return jobBuilderFactory.get("helloJob").start(helloStep1()).build();
    } @Bean
    public Step helloStep1(){ return stepBuilderFactory.get("helloStep1").tasklet(new Tasklet() {
    @Override
    public RepeatStatus execute(StepContribution stepContribution, ChunkContext chunkContext) throws Exception {
    System.out.println("hello world");
    return RepeatStatus.FINISHED;
    }
    }).build();
    }
    }

    ``

从数据库读取

  • JdbcPagingItemReader

      . 设置数据源
    . 设置查询条件
    . 将查询结果映射成实体类
  • MySqlPagingQueryProvider // mysql分页查询支持器

  • 代码示例:

        JdbcPagingItemReader<User> jdbcPagingItemReader = new JdbcPagingItemReader<>();
    jdbcPagingItemReader.setDataSource(dataSource);
    jdbcPagingItemReader.setFetchSize(3);//每次从数据库拉取条数 //设置查询条件
    MySqlPagingQueryProvider pagingQueryProvider = new MySqlPagingQueryProvider();
    pagingQueryProvider.setSelectClause("id,name,password");
    pagingQueryProvider.setFromClause("user"); Map<String, Order> orderMap = new HashMap<>();
    orderMap.put("password",Order.DESCENDING);//设置排序字段
    pagingQueryProvider.setSortKeys(orderMap);
    jdbcPagingItemReader.setQueryProvider(pagingQueryProvider); //设置行映射器
    jdbcPagingItemReader.setRowMapper(new RowMapper<User>() {
    @Override
    public User mapRow(ResultSet resultSet, int i) throws SQLException {
    User user = new User();
    user.setId(resultSet.getInt(1));
    user.setName(resultSet.getString(2));
    user.setPassword(resultSet.getString(3));
    return user;
    }
    });
    return jdbcPagingItemReader;

从txt文件中获取数据

  • FlatFileItemReader
  • DelimitedLineTokenizer //行分词器
  • DefaultLineMapper //行映射器,将一行数据映射成对应的实体
  • defaultLineMapper.setLineTokenizer(delimitedLineTokenizer);
  • flatFileItemReader.setLineMapper(defaultLineMapper);
  • 代码示例:
```
FlatFileItemReader<Hospital> flatFileItemReader = new FlatFileItemReader<>();
flatFileItemReader.setEncoding("utf-8");
flatFileItemReader.setLinesToSkip(1);//跳过第一行
flatFileItemReader.setResource(new ClassPathResource("/data/hospital.txt")); //解析数据 按行分词
DelimitedLineTokenizer delimitedLineTokenizer = new DelimitedLineTokenizer();
delimitedLineTokenizer.setNames("id","org_name","org_type","addr","allow_no","cert_dept",
"start_valid_date","end_invalid_date"); //行映射器
DefaultLineMapper<Hospital> defaultLineMapper = new DefaultLineMapper<>();
defaultLineMapper.setLineTokenizer(delimitedLineTokenizer);
defaultLineMapper.setFieldSetMapper(new FieldSetMapper<Hospital>() {
@Override
public Hospital mapFieldSet(FieldSet fieldSet) throws BindException {
Hospital hospital = new Hospital();
hospital.setId(fieldSet.readInt("id"));
hospital.setAddr(fieldSet.readString("addr"));
hospital.setAllowNo(fieldSet.readString("allow_no"));
hospital.setCertDept(fieldSet.readString("cert_dept"));
hospital.setEndValidDate(fieldSet.readString("end_invalid_date"));
hospital.setOrgName(fieldSet.readString("org_name"));
hospital.setOrgType(fieldSet.readString("org_type"));
hospital.setStartValidDate(fieldSet.readString("start_valid_date"));
return hospital;
}
});
defaultLineMapper.afterPropertiesSet();
flatFileItemReader.setLineMapper(defaultLineMapper); return flatFileItemReader;
```

从xml中读取数据

  • StaxEventItemReader xml读取器

  • pom引入jar包

    ``

      <dependency>
    <groupId>com.thoughtworks.xstream</groupId>
    <artifactId>xstream</artifactId>
    <version>1.4.11.1</version>
    </dependency> <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-oxm</artifactId>
    <version>5.0.8.RELEASE</version>
    </dependency>

    ``

  • xstream实现xml转对象

  • spring-oxm遵循xstream接口规范,实现xml转对象

  • 代码示例:

    ``

          @Bean
    public ItemReader<User> xmlItemReader() { StaxEventItemReader<User> staxEventItemReader = new StaxEventItemReader<>();
    staxEventItemReader.setFragmentRootElementName("user");//设置根标签
    staxEventItemReader.setResource(new ClassPathResource("/data/user.xml"));//设置文件路径 //将xml转成实体对象
    XStreamMarshaller xStreamMarshaller = new XStreamMarshaller();
    Map<String,Class> alias = new HashMap<>();
    alias.put("user",User.class);//key 为根标签,class是key标签下的所有标签映射到的对象
    xStreamMarshaller.setAliases(alias); staxEventItemReader.setUnmarshaller(xStreamMarshaller); return staxEventItemReader;
    }

    ``

多文件读取

  • MultiResourceItemReader

  • 多文件读取,其实就是一个一个文件读取

  • MultiResourceItemReader需要设置文件读取代理,待读取文件资源

  • 代码示例:

    ``

    @Value("classpath:/data/file*.txt")

    private Resource[] resources;

    @Bean

    public MultiResourceItemReader multiFileItemReader() {

       MultiResourceItemReader<Hospital> multiResourceItemReader = new MultiResourceItemReader<>();
    //多文件读取,其实也是一个一个文件进行读取,需要设置文件读取器
    multiResourceItemReader.setDelegate(flatFileItemReader());
    multiResourceItemReader.setResources(resources);
    return multiResourceItemReader;

    }

    @Bean

    public FlatFileItemReader flatFileItemReader(){

    FlatFileItemReader flatFileItemReader = new FlatFileItemReader<>();

    flatFileItemReader.setEncoding("utf-8");

       DelimitedLineTokenizer delimitedLineTokenizer = new DelimitedLineTokenizer();
    delimitedLineTokenizer.setDelimiter(",");
    delimitedLineTokenizer.setNames("id","org_name","org_type","addr","allow_no","cert_dept",
    "start_valid_date","end_invalid_date"); DefaultLineMapper<Hospital> defaultLineMapper = new DefaultLineMapper<>();
    defaultLineMapper.setLineTokenizer(delimitedLineTokenizer);
    defaultLineMapper.setFieldSetMapper(new FieldSetMapper<Hospital>() {
    @Override
    public Hospital mapFieldSet(FieldSet fieldSet) throws BindException {
    Hospital hospital = new Hospital();
    hospital.setStartValidDate(fieldSet.readString("start_valid_date"));
    hospital.setOrgType(fieldSet.readString("org_type"));
    hospital.setOrgName(fieldSet.readString("org_name"));
    hospital.setEndValidDate(fieldSet.readString("end_invalid_date"));
    hospital.setCertDept(fieldSet.readString("cert_dept"));
    hospital.setAllowNo(fieldSet.readString("allow_no"));
    hospital.setAddr(fieldSet.readString("addr"));
    hospital.setId(fieldSet.readInt("id"));
    return hospital;
    }
    }); flatFileItemReader.setLineMapper(defaultLineMapper); return flatFileItemReader;

    }

    ``

从文件中读取,并写入到数据库

  • JdbcBatchItemWriter

  • 代码示例:


    @Bean
    public ItemWriter<Hospital> jdbcBatchItemWriter() {
    JdbcBatchItemWriter<Hospital> jdbcBatchItemWriter = new JdbcBatchItemWriter<>();
    jdbcBatchItemWriter.setDataSource(dataSource);
    jdbcBatchItemWriter.setSql(
    "INSERT INTO `hospital` (`id`, `org_name`, `org_type`, `addr`, `allow_no`, `cert_dept`, `start_valid_date`, `end_invalid_date`) " +
    "VALUES (:id, :orgName, :orgType, :addr, :allowNo, :certDept, :startValidDate, :endValidDate)"
    );
    //将对象属性值映射到sql参数中
    jdbcBatchItemWriter.setItemSqlParameterSourceProvider(new BeanPropertyItemSqlParameterSourceProvider<>());
    return jdbcBatchItemWriter;
    }

从数据库读取,写入到普通文件

  • FlatItemFileWriter

  • 代码示例:

        @Bean
    public ItemWriter<? super Hospital> flatFileItemWriter() { FlatFileItemWriter<Hospital> flatFileItemWriter = new FlatFileItemWriter<>();
    flatFileItemWriter.setEncoding("utf-8");
    //设置存放数据的文件路径
    flatFileItemWriter.setResource(new FileSystemResource("f:/hospital_generate.txt")); flatFileItemWriter.setLineAggregator(new LineAggregator<Hospital>() {
    ObjectMapper objectMapper = new ObjectMapper();
    @Override
    public String aggregate(Hospital item) {
    String result = null;
    try {
    result = objectMapper.writeValueAsString(item);//将对象转json字符串
    } catch (JsonProcessingException e) {
    e.printStackTrace();
    } return result;
    }
    });
    return flatFileItemWriter; }

从数据库读取并写入到xml文件

  • StaxEventItemWriter

  • XstreamMarshaller - xml标签元素与实体对象映射

  • 代码示例

        @Bean
    public ItemWriter<? super Hospital> xmlFileItemWriter() {
    StaxEventItemWriter<Hospital> staxEventItemWriter = new StaxEventItemWriter<>();
    staxEventItemWriter.setEncoding("utf-8");
    staxEventItemWriter.setResource(new FileSystemResource("f:/hospital.xml"));
    staxEventItemWriter.setRootTagName("hospitals"); //XML标签与实体对象映射
    Map<String,Class<Hospital>> alias = new HashMap<>();
    alias.put("hospital",Hospital.class); XStreamMarshaller xStreamMarshaller = new XStreamMarshaller();
    xStreamMarshaller.setAliases(alias); staxEventItemWriter.setMarshaller(xStreamMarshaller); return staxEventItemWriter; }

springbatch的更多相关文章

  1. springbatch操作CSV文件

    一.需求分析 使用Spring Batch对CSV文件进行读写操作: 读取一个含有四个字段的CSV文件(id, name, age, score), 对文件做简单的处理, 然后输出到还有一个csv文件 ...

  2. SpringBatch的核心组件JobLauncher和JobRepository

    Spring Batch的框架包括启动批处理作业的组件和存储Job执行产生的元数据.因此只需掌握配置这个基础框架在批处理应用程序中即启动Jobs并存储Job元数据. 组件:Job Launcher和J ...

  3. SpringBatch简介

    spring Batch是一个轻量级的.完善的批处理框架,旨在帮助企业建立健壮.高效的批处理应用.SpringBatch是Spring的一个子项目,使用Java语言并基于Spring框架为基础开发,使 ...

  4. spring-boot-oracle spring-batch

    Install/Configure Oracle express Oracle xe installer for linux (I don't care if you're running linux ...

  5. springbatch的封装与使用

    springbatch 主要实现批量数据的处理,我对batch进行的封装,提出了jobBase类型,具体job需要实现它即可.Spring Batch 不仅提供了统一的读写接口.丰富的任务处理方式.灵 ...

  6. SpringBatch的流程简介

    SpringBatch的流程图如下: 每个Batch都会包含一个Job.Job就像一个容器,这个容器装了若干Step,Batch中实际干活的也就是这些Step,至于Step干什么活,无外乎读取数据,处 ...

  7. SpringBatch的初步了解

    一.SpringBatch是一个批处理的框架,作为一个Spring组件,提供了通过使用Spring的依赖注入来处理批处理的条件. 什么是批处理呢? 在现代企业应用当中,面对复杂的业务以及海量的数据,除 ...

  8. SpringBatch Sample (五)(复合格式文件的读、多文件的写)

    前面关于Spring Batch的文章,讲述了SpringBatch对CSV文件的读写操作.对XML文件的操作,以及对固定长格式文件的操作.这些事例,同一个Reader读取的都是相同格式的数据,最终写 ...

  9. SpringBatch Sample (四)(固定长格式文件读写)

    前篇关于Spring Batch的文章,讲述了Spring Batch 对XML文件的读写操作. 本文将通过一个完整的实例,与大家一起讨论运用Spring Batch对固定长格式文件的读写操作.实例延 ...

  10. SpringBatch Sample (三)(XML文件操作)

    前篇关于Spring Batch的文章,讲述了Spring Batch 对CSV文件的读写操作. 本文将通过一个完整的实例,与大家一起讨论运用Spring Batch对XML文件的读写操作.实例流程是 ...

随机推荐

  1. windows下进程与线程

    windows下进程与线程 Windows是一个单用户多任务的操作系统,同一时间可有多个进程在执行.进程是应用程序的运行实例,可以理解为应用程序的一次动态执行:而线程是CPU调度的单位,是进程的一个执 ...

  2. 最新 锐之旗java校招面经 (含整理过的面试题大全)

    从6月到10月,经过4个月努力和坚持,自己有幸拿到了网易雷火.京东.去哪儿.锐之旗等10家互联网公司的校招Offer,因为某些自身原因最终选择了锐之旗.6.7月主要是做系统复习.项目复盘.LeetCo ...

  3. MySQL主从复制与读写分离实践

    MySQL主从复制(Master-Slave)与读写分离(MySQL-Proxy)实践  目录: 介绍 MySQL的安装与配置 MySQL主从复制 MySQL读写分离 编译安装lua 安装配置MySQ ...

  4. .net和ASP.net,c#的区别

    .NET.C#和ASP.NET三者之间的区别如下: 一.什么是.NET?.NET是微软公司下的一个开发平台,.NET核心就是.NET Framwork(.NET框架)是.NET程序开发和运行的环境,在 ...

  5. [知乎]鲲鹏920对比intel8180

    作者:韩朴宇链接:https://www.zhihu.com/question/308298687/answer/568737742来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请 ...

  6. [转帖]当 K8s 集群达到万级规模,阿里巴巴如何解决系统各组件性能问题?

    改天学习一下. https://www.cnblogs.com/alisystemsoftware/p/11570806.html   当 K8s 集群达到万级规模,阿里巴巴如何解决系统各组件性能问题 ...

  7. Spring 启动加载资源到内存

    前言 在一些业务场景中,当容器初始化完成之后,需要处理一些操作,比如一些数据的加载.初始化缓存.特定任务的注册等等.我找到了三种方式解决下面的问题. 1.使用PostConstruct注解 这种解决方 ...

  8. java多线程上篇(三) -- 进程通信和线程死锁简单介绍

    进程通信指的是进程间的信息交换 ,IPC(Inter-Process Communication,进程间通信) 进程通信就相当于一种工作方式.沟通形式,进程通信主要指的就是操作系统提供的进程通信工具( ...

  9. (四)Resquest 知识点总结 (来自那些年的笔记)

    目录 URL和URI的区别 获取URL.URI 什么是HttpServletResquest 获取请求头中字段的内容 获取请求信息的数据 将客户机的请求变为一个流返回 常用的方法 request乱码问 ...

  10. wireguard使用方法

    1.翻墙访问网页:https://cryptostorm.is/wireguard.cgi 并下载客户端 2. 选者第二个并打开 3.复制publickey 4.黏贴在第二行并addkey: 5.将获 ...