Spring Batch 基础(一)

1. 简介

Spring Batch 用于大数据量的批处理任务,是一种轻量级的批处理框架。当数据量超过百亿级时,还是要用海量数据处理框架handoop。Spring Batch具有简便、轻盈、容易集成等优点,而且提供了多种Writer 和 Reader借口,让开发者专注于业务处理,Spring Batch负责流程。业务场景: 定期执行、消息驱动、并行处理、手动重启、顺序执行。

特点:轻量级、高健壮、提供开发效率
a. 丰富的开箱即用组件(Reader、Writer),减少开发时间
b. 面向Chunk的处理(写入针对批,兼顾效率和可靠性)
c. 事务管理能力
d. 元数据管理
e. 易监控的批处理应用
f. 丰富的流程定义
g. 健壮的应用特性(跳过,重试,重启)
h. 易扩展
i. 可灵活复用先用的IT资产(通过Adapter封装)

基本概念:

2. Job

Job,顾名思义,就是一个任务,是Spring Batch的最小业务单元。它往往是由多个Step构成,

这些Step按照一定的次序组织在一个Job中。Job具有一些配置参数:

1. Job的名称

2. 定义或者排序Step

3. 配置Job是否可以重新启动

2.1 JobInstance

每个Job的运行实例,Job每执行一次就是一个JobInstance。

2.2 JobParameters

与JobInstance绑定,指定JobInstance的运行参数,如执行时间等。

2.3 JobExecution

是JobInstance的一次运行,运行结果为失败或者成功。注意一个JobInstance的一次完整运行,则JobExecution必须是成功的,否则还会是同一个JobInstance。

3. Step

一个Job是由多个Step构成,是批处理的最小单位的执行单元。

3.1 StepExecution

是Step的一次运行,类似于JobExecution。但是不同之处在于,如果一个StepExecution失败了,那么下一个Step将不会拥有StepExecution。

4. ExecutionContext

这是一个Key-Value的集合,是用来对JobExecution和StepExecution的执行状态的储存。一般情况下用来进行restart操作。

一个JobExecution对应一个ExectionContext,而所有的StepExecution共有一个StepExection。

5 JobRepository

是对所有Job、Step的持久化操作。当一个Job启动后,一个JobExection就会从JobRepository中获得。

其它概念还有JobLaucher、ItemReader、ItemWriter、ItemProcessor等,这里不做介绍了。

 

更多信息请参考官网:https://docs.spring.io/spring-batch/trunk/reference/html/index.html

本文主要就一个demo进行介绍

 

3. 实例Demo

 

使用MyBatis框架,进行read和write。当然也可以使用JdbcTemplate进行同样的操作。

单独定义一个ItemWriter

@Component
public class UserBatchWriter implements ItemWriter<User>, BeanPostProcessor {

    private Logger logger = LoggerFactory.getLogger(UserBatchWriter.class);

    @Autowired
    private UserDao userDao;

    @Autowired
    private JdbcTemplate userJdbcTemplate;

    @Override
    public void write(List<? extends User> list) throws Exception {
        logger.info("list:"+ Arrays.toString(list.toArray()));
        System.out.println("write thread:"+ Thread.currentThread().getName());
        userDao.updateAllUsers(list);
    }
}

 

然后对批处理进行配置

 

package com.qd.almo.hilearning.config;

import com.qd.almo.hilearning.batch.BatisCursorItemReader;
import com.qd.almo.hilearning.batch.BatisPagingItemReader;
import com.qd.almo.hilearning.batch.UserBatchWriter;
import com.qd.almo.hilearning.dao.UserDao;
import com.qd.almo.hilearning.model.User;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.batch.MyBatisCursorItemReader;
import org.mybatis.spring.batch.MyBatisPagingItemReader;
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.core.launch.support.RunIdIncrementer;
import org.springframework.batch.item.ItemProcessor;
import org.springframework.batch.item.ItemReader;
import org.springframework.batch.item.ItemWriter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Component;

import java.util.List;

/**
 * user: almo
 * date: 2019/7/2
 **/
@Configuration
public class MigrateBatchConfig  {

    @Autowired
    protected JobBuilderFactory jobBuilderFactory;

    @Autowired
    protected StepBuilderFactory stepBuilderFactory;

    @Bean("migrateJob")
    public Job migrateJob(@Qualifier("migrateStep") Step step) {
        return jobBuilderFactory.get("migrateJob")
                .incrementer(new RunIdIncrementer())
                .flow(step)//为Job指定Step
                .end()
                .build();
    }

    @Bean
    public Step migrateStep(@Qualifier("userReader") ItemReader reader, @Qualifier("userProcessor") ItemProcessor<User, User> processor,
                            UserBatchWriter writer) {
        return stepBuilderFactory
                .get("migrateStep")
                .<User, User>chunk(5)//批处理每次提交65000条数据
                .reader(reader)//给step绑定reader
                .processor(processor)//给step绑定processor
                .writer(writer)//给step绑定writer
                .build();
    }

    @Bean
    public ItemReader<User> userReader(@Qualifier("mybatis-sqlSessionFactory") SqlSessionFactory sqlSessionFactory) {
        BatisCursorItemReader reader = new BatisCursorItemReader();
        reader.setQueryId("com.qd.almo.hilearning.dao.UserDao.selectAllUsers");
        reader.setSqlSessionFactory(sqlSessionFactory);
        return reader;
    }

    @Bean
    public ItemProcessor<User, User> userProcessor() {
        return new ItemProcessor<User, User>() {
            @Override
            public User process(User user) throws Exception {
                user.setPhone("3");
                System.out.println("processor thread:"+ Thread.currentThread().getName());
                return user;
            }
        };
    }

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Batch权威指南》是一本非常有价值的书籍,它全面介绍了Spring Batch框架的核心概念、使用方法和最佳实践,对于想要学习和掌握Spring Batch的开发人员来说,是一本必不可少的参考书。 该书主要分为四个部分。第一部分是Spring Batch基础知识,主要介绍了批处理的概念、Spring Batch的架构和主要组件,以及如何创建和配置Spring Batch的应用程序。第二部分是作业配置,包括如何定义和配置作业、步骤和任务等,以及作业参数和作业执行的监控与管理。第三部分是读取和写入数据,介绍了Spring Batch中各种读取和写入数据的方式,包括文件、数据库、REST接口等,并且给出了一些常见的使用示例。第四部分是高级特性,包括事务和并发处理、异常处理、转换和验证数据等。 该书的优点是内容全面详细,作者对Spring Batch框架的各个方面进行了深入的讲解,并且提供了丰富的实例和代码,帮助读者更好地理解和应用知识。此外,该书还对一些常见的问题和注意事项进行了阐述,帮助读者避免一些常见的错误。 总之,如果你想要学习和应用Spring Batch框架,我强烈推荐你阅读《Spring Batch权威指南》这本书。它将帮助你全面了解和掌握Spring Batch的开发技巧,提高批处理应用程序的开发效率和质量。无论你是初学者还是有一定经验的开发人员,这本书都能为你提供宝贵的参考和指导。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值