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. Evaluating Automatically Generated timelines from the Web (paper1)

    摘要: 问题:There is a need that 以一个更全面/更综合的方式来展现搜索结果.对此,作者正在开发一个系统,called “Cronopath”,这个系统将产生一个时间线,通过决定每 ...

  2. XDebug调试

    安装 访问Xdebug 点击download 找到RELEASES,点击 custom installation instructions. 在白色框框内填入phpinfo()出来的源码 点击Anal ...

  3. 使用寄存器点亮LED(第1节)—GPIO功能框图讲解

    GPIO简介 GPIO 是通用输入输出端口的简称,简单来说就是 STM32 可控制的引脚, STM32 芯片的 GPIO 引脚与外部设备连接起来,从而实现与外部通讯.控制以及数据采集的功能.STM32 ...

  4. 在一台服务器上启动多个Broker

    1:把整个conf文件夹复制一份,比如叫做conf22:修改里面的activemq.xml文件(1)里面的brokerName 不能跟原来的重复(2)数据存放的文件名称不能重复,比如:<kaha ...

  5. 通过pip命令导出和导入Python环境安装包

    我们在开发完代码后,一般需要将依赖包导出,然后在移植到其他系统使去安装,保证环境正常   导出Python环境安装包[root@bogon ~]# pip freeze > packages.t ...

  6. BZOJ4566 HAOI2016找相同字符(后缀自动机)

    对第一个串建SAM,第二个串在上面跑,记录当前前缀匹配的最长后缀长度l,每次考虑当前前缀的贡献,对于当前所在节点显然是|right|*(l-len[fa]),而对于其parent树上所有祖先的贡献显然 ...

  7. qt翻译和国际化的探讨。

    这段时间一直都在怼qt的国际化,以前也接触过国际化,但是感觉不是那么的深刻,这次是因为一个项目要做一个国际化的版本,代码里面是不能出现中文的,所以就翻译了一下.qt用的是4.8.6 64位的,IDE( ...

  8. hdu 6153 思维+扩展kmp

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6153 扩展kmp不理解的看下:http://www.cnblogs.com/z1141000271/p ...

  9. 开发环境,不用每次都ant自动编译

    公司所用ant技术,每次改个java文件,配置文件都需要重新编译一次发布 在实际搭环境的过程发现,ant就是把项目目录下的文件编译成功后的搬移到到 ,Tomcat 运行环境配置的目录下,凡是修改的文件 ...

  10. Java Web-JSTL

    Java Web-JSTL 概念 Java Server Pages Tag Library:JSP标准标签库 是由Apache组织提供的开源.免费JSP标签 用于简化和替换JSP页面上的Java代码 ...