----------------------------------------------------------------------------------------------------------------------------------
一、配置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);
}
}
注:以上仅为个人理解,如有问题请指教。