Spring Boot 集成 批处理框架Spring batch

分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow

也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!

               

Spring Batch是一个轻量级的框架,完全面向Spring的批处理框架,用于企业级大量的数据读写处理系统。以POJO和Spring 框架为基础,包括日志记录/跟踪,事务管理、 作业处理统计工作重新启动、跳过、资源管理等功能。

       业务方案:

1、批处理定期提交。

2、并行批处理:并行处理工作。

3、企业消息驱动处理

4、大规模的并行处理

5、手动或是有计划的重启

6、局部处理:跳过记录(如:回滚)

      技术目标:

1、利用Spring编程模型:使程序员专注于业务处理,让Spring框架管理流程。

2、明确分离批处理的执行环境和应用。

3、提供核心的,共通的接口。

4、提供开箱即用(out of the box)的简单的默认的核心执行接口。

5、提供Spring框架中配置、自定义、和扩展服务。

6、所有存在的核心服务可以很容的被替换和扩展,不影响基础层。

7、提供一个简单的部署模式,利用Maven构建独立的Jar文件。

实现步骤:

1.定义处理对象

2.创建中间转换器 ***ItemProcessor 实现 ItemProcessor<I,O>接口

3.创建工作Job BatchConfiguration 主要处理读数据、处理数据、写数据等操作

4.创建listener job执行监听器

 

 

一般的批处理系统需要处理大量的数据, 内部消化单条记录失败的情况, 还要管理中断,在重启后也不去重复执行已经处理过的部分

 

 Spring Batch单/多处理单元(processors), 以及多个微线程(tasklets)

具体实现过程:

1.引入jar:

<!-- Spring-boot启动项目 --> <parent>  <groupId>org.springframework.boot</groupId>  <artifactId>spring-boot-starter-parent</artifactId>  <version>1.3.1.RELEASE</version> </parent> <properties>  <java.version>1.8</java.version> </properties>    <!--Spring batch核心包-> <dependencies>  <dependency>   <groupId>org.springframework.boot</groupId>   <artifactId>spring-boot-starter-batch</artifactId>  </dependency>  <dependency>   <groupId>mysql</groupId>   <artifactId>mysql-connector-java</artifactId>  </dependency>  </dependencies>

2.配置application.properties :配置数据源

######mysql\u6570\u636E\u6E90#########spring.datasource.driver-class-name=com.mysql.jdbc.Driverspring.datasource.password= wbw123456spring.datasource.url= jdbc:mysql://localhost/mydatabasespring.datasource.username=root<a target=_blank href="http://projects.spring.io/spring-batch/">点击打开链接</a>


3.新建实体类
package com.my.gs.batch.processing.domain;public class Person //ID    private Integer personId;    //姓名    private String personName;    //年龄    private String personAge;    //性别    private String personSex;        public Person(){}; public Person( String personName, String personAge,   String personSex) {  this.personName = personName;  this.personAge = personAge;  this.personSex = personSex; } public Integer getPersonId() {  return personId; } public void setPersonId(Integer personId) {  this.personId = personId; } public String getPersonName() {  return personName; } public void setPersonName(String personName) {  this.personName = personName; } public String getPersonAge() {  return personAge; } public void setPersonAge(String personAge) {  this.personAge = personAge; } public String getPersonSex() {  return personSex; } public void setPersonSex(String personSex) {  this.personSex = personSex; }        }

4.中间转换器:

package com.my.gs.batch.processing.itemprocessor;import java.sql.ResultSet;import java.sql.SQLException;import java.util.List;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.batch.item.ItemProcessor;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.jdbc.core.JdbcTemplate;import org.springframework.jdbc.core.RowMapper;import com.my.gs.batch.processing.domain.Person;/** * 中间转换器 * @author wbw * */public class PersonItemProcessor implements ItemProcessor<Person, Person> //查询 private static final String GET_PRODUCT = "select * from Person where personName = ?";     private static final Logger log = LoggerFactory.getLogger(PersonItemProcessor.class);    @Autowired    private JdbcTemplate jdbcTemplate;    @Override    public Person process(final Person person) throws Exception {        List<Person> personList = jdbcTemplate.query(GET_PRODUCT, new Object[] {person.getPersonName()}, new RowMapper<Person>() {            @Override            public Person mapRow( ResultSet resultSet, int rowNum ) throws SQLException {             Person p = new Person();             p.setPersonName(resultSet.getString(1));             p.setPersonAge(resultSet.getString(2));             p.setPersonSex(resultSet.getString(3));                return p;            }        });        if(personList.size() >0){         log.info("该数据已录入!!!");        }     String sex = null;        if(person.getPersonSex().equals("0")){         sex ="男";        }else{         sex ="女";        }        log.info("转换 (性别:"+person.getPersonSex()+") 为 (" + sex + ")");        final Person transformedPerson = new Person(person.getPersonName(), person.getPersonAge(),sex);        log.info("转换 (" + person + ") 为 (" + transformedPerson + ")");        return transformedPerson;    }}
5.处理具体工作业务  主要包含三个部分:读数据、处理数据、写数据

package com.my.gs.batch.processing.configuration;import javax.sql.DataSource;import org.springframework.batch.core.Job;import org.springframework.batch.core.JobExecutionListener;import org.springframework.batch.core.Step;import org.springframework.batch.core.configuration.annotation.EnableBatchProcessing;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.batch.item.database.BeanPropertyItemSqlParameterSourceProvider;import org.springframework.batch.item.database.JdbcBatchItemWriter;import org.springframework.batch.item.file.FlatFileItemReader;import org.springframework.batch.item.file.mapping.BeanWrapperFieldSetMapper;import org.springframework.batch.item.file.mapping.DefaultLineMapper;import org.springframework.batch.item.file.transform.DelimitedLineTokenizer;import org.springframework.beans.factory.annotation.Qualifier;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.core.io.ClassPathResource;import org.springframework.jdbc.core.JdbcTemplate;import com.my.gs.batch.processing.domain.Person;import com.my.gs.batch.processing.itemprocessor.PersonItemProcessor;/** * 处理具体工作业务  主要包含三个部分:读数据、处理数据、写数据 * @author wbw * */@Configuration@EnableBatchProcessingpublic class PersonBatchConfiguration //插入语句   private static final String PERSON_INSERT = "INSERT INTO Person (personName, personAge,personSex) VALUES (:personName, :personAge,:personSex)";   public static final String Person_INSERT = "INSERT INTO Person (id, name,description,quantity) VALUES (:id, :name,:description,:quantity)";   // tag::readerwriterprocessor[] 1.读数据    @Bean    public ItemReader<Person> reader() {        FlatFileItemReader<Person> reader = new FlatFileItemReader<Person>();        //加载外部文件数据 文件类型:CSV        reader.setResource(new ClassPathResource("sample-data.csv"));        reader.setLineMapper(new DefaultLineMapper<Person>() {{            setLineTokenizer(new DelimitedLineTokenizer() {{                setNames(new String[] { "personName","personAge","personSex" });            }});            setFieldSetMapper(new BeanWrapperFieldSetMapper<Person>() {{                setTargetType(Person.class);            }});        }});        return reader;    }    //2.处理数据    @Bean    public PersonItemProcessor processor() {        return new PersonItemProcessor();    }    //3.写数据    @Bean    public ItemWriter<Person> writer(DataSource dataSource) {        JdbcBatchItemWriter<Person> writer = new JdbcBatchItemWriter<Person>();        writer.setItemSqlParameterSourceProvider(new BeanPropertyItemSqlParameterSourceProvider<Person>());        writer.setSql(PERSON_INSERT);        writer.setDataSource(dataSource);        return writer;    }    // end::readerwriterprocessor[]        // tag::jobstep[]    @Bean    public Job importUserJob(JobBuilderFactory jobs, @Qualifier("step1")Step s1, JobExecutionListener listener) {        return jobs.get("importUserJob")                .incrementer(new RunIdIncrementer())                .listener(listener)                .flow(s1)                .end()                .build();    }    @Bean    public Step step1(StepBuilderFactory stepBuilderFactory, ItemReader<Person> reader,            ItemWriter<Person> writer, ItemProcessor<Person, Person> processor) {        return stepBuilderFactory.get("step1")                .<Person, Person> chunk(10)                .reader(reader)                .processor(processor)                .writer(writer)                .build();    }    // end::jobstep[]    @Bean    public JdbcTemplate jdbcTemplate(DataSource dataSource) {        return new JdbcTemplate(dataSource);    }}
6.监听器:用于处理任务执行之后和之前
<pre name="code" class="java">package com.my.gs.batch.processing.listener;import java.sql.ResultSet;import java.sql.SQLException;import java.util.List;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.batch.core.BatchStatus;import org.springframework.batch.core.JobExecution;import org.springframework.batch.core.listener.JobExecutionListenerSupport;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.jdbc.core.JdbcTemplate;import org.springframework.jdbc.core.RowMapper;import org.springframework.stereotype.Component;import com.my.gs.batch.processing.domain.Person;/** * Job执行监听器 * @author wbw * */@Componentpublic class JobCompletionNotificationListener extends JobExecutionListenerSupport {      private static final String PERSON_SQL = "SELECT personName, personAge,personSex FROM Person";    private static final Logger log = LoggerFactory.getLogger(JobCompletionNotificationListener.class);    @Autowired private  JdbcTemplate jdbcTemplate; @Autowired public JobCompletionNotificationListener(JdbcTemplate jdbcTemplate) {  if(this.jdbcTemplate==null){  this.jdbcTemplate = jdbcTemplate;  } } @Override public void afterJob(JobExecution jobExecution) {  if(jobExecution.getStatus() == BatchStatus.COMPLETED) {   log.info("!!! JOB 执行完成!");   List<Person> results = jdbcTemplate.query(PERSON_SQL, new RowMapper<Person>() {    @Override    public Person mapRow(ResultSet rs, int row) throws SQLException {     return new Person(rs.getString(1), rs.getString(2),rs.getString(3));    }   });            log.info("入库条数---------"+results.size());   for (Person person : results) {    log.info("新增 <" + person.getPersonName() + "> 成功!!!!!");   }  } } /* (non-Javadoc)  * @see org.springframework.batch.core.listener.JobExecutionListenerSupport#beforeJob(org.springframework.batch.core.JobExecution)  */ @Override public void beforeJob(JobExecution jobExecution) {  // TODO Auto-generated method stub  super.beforeJob(jobExecution); } }

 
  
7.新建csv文件
<img src="data:image/png;base64,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" alt="" />
</pre><pre code_snippet_id="1563739" snippet_file_name="blog_20160124_10_8470765" name="code" class="java">8.启动执行
<pre name="code" class="java">package com.my.batch;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplicationpublic class Application {    public static void main(String[] args) throws Exception {        SpringApplication.run(Application.class, args);    }}

更多相关资源:http://projects.spring.io/spring-batch/
 
  
  1.   
 
  

           

给我老师的人工智能教程打call!http://blog.csdn.net/jiangjunshow

这里写图片描述

猜你喜欢

转载自blog.csdn.net/hfuuhgcc/article/details/84195812