springbatch

主要实现批量数据的处理,我对batch进行的封装,提出了jobBase类型,具体job需要实现它即可。Spring Batch 不仅提供了统一的读写接口、丰富的任务处理方式、灵活的事务管理及并发处理,同时还支持日志、监控、任务重启与跳过等特性,大大简化了批处理应用开发,将开发人员从复杂的任务配置管理过程中解放出来,使他们可以更多地去关注核心的业务处理过程。

几个组件

  • job
  • step
  • read
  • write
  • listener
  • process
  • validator

JobBase定义了几个公用的方法

 /**
* springBatch的job基础类.
*/
public abstract class JobBase<T> { /**
* 批次.
*/
protected int chunkCount = 5000;
/**
* 监听器.
*/
private JobExecutionListener jobExecutionListener;
/**
* 处理器.
*/
private ValidatingItemProcessor<T> validatingItemProcessor;
/**
* job名称.
*/
private String jobName;
/**
* 检验器.
*/
private Validator<T> validator;
@Autowired
private JobBuilderFactory job;
@Autowired
private StepBuilderFactory step; /**
* 初始化.
*
* @param jobName job名称
* @param jobExecutionListener 监听器
* @param validatingItemProcessor 处理器
* @param validator 检验
*/
public JobBase(String jobName,
JobExecutionListener jobExecutionListener,
ValidatingItemProcessor<T> validatingItemProcessor,
Validator<T> validator) {
this.jobName = jobName;
this.jobExecutionListener = jobExecutionListener;
this.validatingItemProcessor = validatingItemProcessor;
this.validator = validator;
} /**
* job初始化与启动.
*/
public Job getJob() throws Exception {
return job.get(jobName).incrementer(new RunIdIncrementer())
.start(syncStep())
.listener(jobExecutionListener)
.build();
} /**
* 执行步骤.
*
* @return
*/
public Step syncStep() throws Exception {
return step.get("step1")
.<T, T>chunk(chunkCount)
.reader(reader())
.processor(processor())
.writer(writer())
.build();
} /**
* 单条处理数据.
*
* @return
*/
public ItemProcessor<T, T> processor() {
validatingItemProcessor.setValidator(processorValidator());
return validatingItemProcessor;
} /**
* 校验数据.
*
* @return
*/
@Bean
public Validator<T> processorValidator() {
return validator;
} /**
* 批量读数据.
*
* @return
* @throws Exception
*/
public abstract ItemReader<T> reader() throws Exception; /**
* 批量写数据.
*
* @return
*/
@Bean
public abstract ItemWriter<T> writer(); }

主要规定了公用方法的执行策略,而具体的job名称,读,写还是需要具体JOB去实现的。

具体Job实现

 @Configuration
@EnableBatchProcessing
public class SyncPersonJob extends JobBase<Person> {
@Autowired
private DataSource dataSource;
@Autowired
@Qualifier("primaryJdbcTemplate")
private JdbcTemplate jdbcTemplate; /**
* 初始化,规则了job名称和监视器.
*/
public SyncPersonJob() {
super("personJob", new PersonJobListener(), new PersonItemProcessor(), new BeanValidator<>());
} @Override
public ItemReader<Person> reader() throws Exception {
StringBuffer sb = new StringBuffer();
sb.append("select * from person");
String sql = sb.toString();
JdbcCursorItemReader<Person> jdbcCursorItemReader =
new JdbcCursorItemReader<>();
jdbcCursorItemReader.setSql(sql);
jdbcCursorItemReader.setRowMapper(new BeanPropertyRowMapper<>(Person.class));
jdbcCursorItemReader.setDataSource(dataSource); return jdbcCursorItemReader;
} @Override
@Bean("personJobWriter")
public ItemWriter<Person> writer() {
JdbcBatchItemWriter<Person> writer = new JdbcBatchItemWriter<Person>();
writer.setItemSqlParameterSourceProvider(new BeanPropertyItemSqlParameterSourceProvider<Person>());
String sql = "insert into person_export " + "(id,name,age,nation,address) "
+ "values(:id, :name, :age, :nation,:address)";
writer.setSql(sql);
writer.setDataSource(dataSource);
return writer;
} }

写操作需要定义自己的bean的声明

注意,需要为每个job的write启个名称,否则在多job时,write将会被打乱

  /**
* 批量写数据.
*
* @return
*/
@Override
@Bean("personVerson2JobWriter")
public ItemWriter<Person> writer() { }

添加一个api,手动触发

 @Autowired
SyncPersonJob syncPersonJob; @Autowired
JobLauncher jobLauncher; void exec(Job job) throws Exception {
JobParameters jobParameters = new JobParametersBuilder()
.addLong("time", System.currentTimeMillis())
.toJobParameters();
jobLauncher.run(job, jobParameters);
} @RequestMapping("/run1")
public String run1() throws Exception {
exec(syncPersonJob.getJob());
return "personJob success";
}

springbatch的封装与使用的更多相关文章

  1. java~springboot~目录索引

    回到占占推荐博客索引 最近写了不过关于java,spring,微服务的相关文章,今天把它整理一下,方便大家学习与参考. java~springboot~目录索引 Java~关于开发工具和包包 Java ...

  2. springbatch操作CSV文件

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

  3. SpringBatch Sample (二)(CSV文件操作)

    本文将通过一个完整的实例,与大家一起讨论运用Spring Batch对CSV文件的读写操作.此实例的流程是:读取一个含有四个字段的CSV文件(ID,Name,Age,Score),对读取的字段做简单的 ...

  4. SpringBatch批处理框架:入门项目

    1.项目结构如下:

  5. [C#] 简单的 Helper 封装 -- RegularExpressionHelper

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  6. iOS开发之App间账号共享与SDK封装

    上篇博客<iOS逆向工程之KeyChain与Snoop-it>中已经提到了,App间的数据共享可以使用KeyChian来实现.本篇博客就实战一下呢.开门见山,本篇博客会封装一个登录用的SD ...

  7. Ajax实现原理,代码封装

    都知道实现页面的异步操作需要使用Ajax,那么Ajax到是怎么实现异步操作的呢? 首先需要认识一个对象 --> XMLHttpRequest 对象 --> Ajax的核心.它有许多的属性和 ...

  8. 用C语言封装OC对象(耐心阅读,非常重要)

    用C语言封装OC对象(耐心阅读,非常重要) 本文的主要内容来自这里 前言 做iOS开发的朋友,对OC肯定非常了解,那么大家有没有想过OC中NSInteger,NSObject,NSString这些对象 ...

  9. 【知识必备】RxJava+Retrofit二次封装最佳结合体验,打造懒人封装框架~

    一.写在前面 相信各位看官对retrofit和rxjava已经耳熟能详了,最近一直在学习retrofit+rxjava的各种封装姿势,也结合自己的理解,一步一步的做起来. 骚年,如果你还没有掌握ret ...

随机推荐

  1. node八-核心模块、包

    学会查API,远比会几个API更重要. 核心模块意义 -如果只是在服务器运行javascript代码,并没有多大意义,因为无法实现任何功能>读写文件.访问网络 -Node的用处在于它本身还提供可 ...

  2. 学HTTP协议所要知道的基础知识(微总结)

    1.网络本质 进行资源共享和信息传输. 2.基于网络的应用程序的本质 就是获取数据和传输数据给用户使用. 3.TCP/IP协议栈工作流程 实体层是不属于TCP/IP协议栈的一层.也就是说TCP/IP协 ...

  3. html 标签内联元素和块元素分类【转】

    常见的块状元素与内联元素 块状元素 内联元素 address - 地址 blockquote - 块引用 center - 居中对齐 dir - 目录列表 div - 常用块级容易,也是CSS lay ...

  4. 【转】javascript 作用域链

    JavaScript函数的作用域链分为定义时作用域链和运行时作用域链: 函数被定义的时候,它有一个属性[[scope]]标明它的定义作用域链,定义时作用域链[[scope]]遵守这样的规则:一个函数的 ...

  5. JavaScript里面的循环方法小结

    一,原生JavaScript中的循环: for 循环代码块一定的次数,它有三个参数,来决定代码块的循环次数,第一个是初始值,第二个是终止值,第三个参数是变化规则: //for循环 for(var i ...

  6. 【多线程】-ThreadPool线程池

    ThreadPool介绍: Thread类是一个静态类,所有不存在实例化构造函数操作,直接可以调用其内所存在的方法. 微软官网给出的解释: 提供一个线程池,该线程池可用于执行任务.发送工作项.处理异步 ...

  7. vsts + XX云服务器构建netcore+docker持续集成交付部署

    持续集成交付部署是什么意思,它给我们带来什么好处? 先贴一张图 持续集成(Continuous Integration) 持续集成强调开发人员提交了新代码之后,立刻进行构建.(单元)测试(这个要看情况 ...

  8. python 序列化及其相关模块(json,pickle,shelve,xml)详解

    什么是序列化对象? 我们把对象(变量)从内存中编程可存储或传输的过程称之为序列化,在python中称为pickle,其他语言称之为serialization ,marshalling ,flatter ...

  9. SpringMVC中的异常处理

    springmvc在处理请求过程中出现异常信息交由异常处理器进行处理,自定义异常处理器可以实现一个系统的异常处理逻辑. 1. 异常处理思路 系统中异常包括两类:预期异常和运行时异常RuntimeExc ...

  10. 使用JWT的OAuth2的SSO分析

    参考:https://github.com/spring-guides/tut-spring-security-and-angular-js/blob/master/oauth2/README.ado ...