spring boot + spring batch 读取数据库文件

----------------------------------------------------------------------------------------------------------------------------------

一、配置JOB

import javax.sql.DataSource;

import org.springframework.batch.core.Job;
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.ExecutionContext;
import org.springframework.batch.item.ItemProcessor;
import org.springframework.batch.item.ItemReader;
import org.springframework.batch.item.ParseException;
import org.springframework.batch.item.UnexpectedInputException;
import org.springframework.batch.item.database.JdbcCursorItemReader;
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.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;

/**
 * @Description : 处理具体工作业务  主要包含三个部分:读数据、处理数据、写数据 
 */
@Configuration  
@EnableBatchProcessing // 开启批处理  系统会在启动时执行,阻止自动执行job需要在配置文件添加配置
public class BatchConfiguration {  

/**
     * 作业仓库
     */
    /*@Bean  使用数据库记录日志
    public JobRepository jobRepository(DataSource dataSource, PlatformTransactionManager transactionManager) throws Exception{
        JobRepositoryFactoryBean jobRepositoryFactoryBean = new JobRepositoryFactoryBean();
        jobRepositoryFactoryBean.setDataSource(dataSource);
        jobRepositoryFactoryBean.setTransactionManager(transactionManager);
        jobRepositoryFactoryBean.setDatabaseType(DatabaseType.MYSQL.name());

        return jobRepositoryFactoryBean.getObject();
    }*/


    /**
     * 作业调度器
     */
    /*public SimpleJobLauncher jobLauncher(DataSource dataSource, PlatformTransactionManager transactionManager) throws Exception{
        SimpleJobLauncher jobLauncher = new SimpleJobLauncher();
        jobLauncher.setJobRepository(this.jobRepository(dataSource, transactionManager));
        return jobLauncher;
    }*/
//使用默认提供方式
@Autowired
    public JobBuilderFactory jobBuilderFactory;

    @Autowired
    public StepBuilderFactory stepBuilderFactory;

   // tag::readerwriterprocessor[] 1.读数据  
   @Bean  
   public ItemReader<Bean> reader(DataSource dataSource) throws UnexpectedInputException, ParseException, Exception {  

    //读数据可以读文件、数据库等,我这只使用了读取数据库的方式

        JdbcCursorItemReader<Bean> itemReader = new JdbcCursorItemReader<Bean>();

    itemReader.setDataSource(dataSource);
    itemReader.setSql("select * from  xx");
    itemReader.setRowMapper(new  BeanPropertyRowMapper<Bean>(Bean.class要转换成的bean));
    ExecutionContext executionContext = new ExecutionContext();
    itemReader.open(executionContext);
    Object customerCredit = new Object();
    while(customerCredit != null){
        customerCredit = itemReader.read();
    }
    itemReader.close();
    return itemReader;
    }  
  
    //2.处理数据  
    @Bean  

    public JdbcItemProcessor processor() {  

        return new JdbcItemProcessor();  
    }
    
    //3.写数据
    @Bean
    public JdbcItemWriter writer(JdbcTemplate jdbcTemplate) {
    //自定义写数据操作
    JdbcItemWriter writer = new JdbcItemWriter(jdbcTemplate);
    return writer;
    }
    
    // end::readerwriterprocessor[]  
  
    // tag::jobstep[] 生成job
    @Bean  
    public Job importJob(JobBuilderFactory jobs, @Qualifier("step1")Step s1, JdbcItemJobListener listener) {  
        return jobs.get("importJob")  
                .incrementer(new RunIdIncrementer())  
                .listener(listener)  
                .flow(s1)  
                .end()  
                .build();
    }
    
    //执行步骤
    @Bean  
    public Step step1(StepBuilderFactory stepBuilderFactory, ItemReader<Bean> reader,  
    JdbcItemWriter jdbcItemWriter, ItemProcessor<Bean, DealBean> processor) {  
        return stepBuilderFactory.get("step1")  
                .<Bean, DealBean> chunk(100)   //一次处理多少数据
                .reader(reader)  
                .processor(processor)  
                .writer(jdbcItemWriter)  
                .build();  
    }

}  

---------------------------------------------------------------------------------------------------------------------------------

二、数据处理:

import org.springframework.batch.item.ItemProcessor

/**
 *处理数据器
 *ItemProcessor<Bean, DealBean>
 *Bean为传入数据,DealBean为处理后返回数据
 */
public class JdbcItemProcessor implements ItemProcessor<Bean, DealBean> {

public DealBean process(Bean bean) throws Exception {
// Bean bean 为读操作数据
DealBean deal = new DealBean();

return deal;

}
}

----------------------------------------------------------------------------------------------------------------------------------

三、写操作

import java.util.List;

import org.springframework.batch.item.ItemWriter;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.jdbc.core.JdbcTemplate;

public class JdbcItemWriter implements ItemWriter<DealBean>, InitializingBean{

private JdbcTemplate jdbcTemplate;

public JdbcItemWriter(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}


@Override
public void write(List<? extends DealBean> dealBeans) {

//备份clear_atm

try {
for( DealBean dealBean : dealBeans ){
//删除当前表,然后更新
jdbcTemplate.update( SQL语句,传入参数,,,);
        }
} catch (Exception e) {
e.printStackTrace();
}
}

@Override
public void afterPropertiesSet() throws Exception {
// TODO Auto-generated method stub

}

}

----------------------------------------------------------------------------------------------------------------------------------四、监听

import org.springframework.batch.core.BatchStatus;  
import org.springframework.batch.core.JobExecution;  
import org.springframework.batch.core.listener.JobExecutionListenerSupport;  
import org.springframework.stereotype.Component;  


/**
 *Job执行监听器 
 */
@Component  
public class JdbcItemJobListener extends JobExecutionListenerSupport {  
     
  
    @Override  
    public void afterJob(JobExecution jobExecution) {  
        if(jobExecution.getStatus() == BatchStatus.COMPLETED) {  
            log.info("!!! JOB 执行完成!");  
        }  
    }  
  
    @Override  
    public void beforeJob(JobExecution jobExecution) {  
        // TODO Auto-generated method stub  
        super.beforeJob(jobExecution);  
        log.info("!!! JOB 执行开始!");  
    }  

   --------------------------------------------------------------------------------------------------------------------------------

五、定时启动

import org.springframework.batch.core.Job;
import org.springframework.batch.core.JobParameters;
import org.springframework.batch.core.JobParametersBuilder;
import org.springframework.batch.core.launch.JobLauncher;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.web.bind.annotation.RestController;

public class Controller {

    @Autowired
    JobLauncher jobLauncher;
    @Autowired
    Job importJob;
    public JobParameters jobParameters;

    //定时执行
    @Scheduled(cron = "0 0 0 10 * ?")
    public void execute() throws Exception{
        jobParameters = new JobParametersBuilder().addLong("time", System.currentTimeMillis()).toJobParameters();
        jobLauncher.run(importJob, jobParameters);
    }

}

注:以上仅为个人理解,如有问题请指教。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值