springboot集成Spring Batch  20220902
    1、pom.xml
  <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-batch</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>
            <scope>runtime</scope>
        </dependency>
    </dependencies>
2、application.properties
      # 应用名称
      spring.application.name=batch2029
      # 应用服务 WEB 访问端口
      server.port=2029 
 3、Reader 
package com.sc.batch2029.reader;
import org.springframework.batch.item.ItemReader;
import org.springframework.batch.item.NonTransientResourceException;
import org.springframework.batch.item.ParseException;
import org.springframework.batch.item.UnexpectedInputException;public class Reader implements ItemReader {
    private  String[] messages={"篮球之神 Michael Jordan,欢来到Batch示例 Webcome to Spring batch Example"};
    private  int count=0;    @Override
    public Object read() throws Exception, UnexpectedInputException, ParseException, NonTransientResourceException {
        if(count<messages.length){
            return  messages[count++];
        }else {
            count=0;
        }
        return null;
    }
}4、Write 
package com.sc.batch2029.write;
import org.springframework.batch.item.ItemWriter;
import java.util.List;public class Write implements ItemWriter<String> {
    @Override
    public void write(List<? extends String> messages) throws Exception {
        for(String msg:messages){
            System.out.println("输出信息:"+msg);
        }
    }
}5、BatchConfig  
package com.sc.batch2029.config;
import com.sc.batch2029.listen.JobCompletionLister;
import com.sc.batch2029.processor.Processor;
import com.sc.batch2029.reader.Reader;
import com.sc.batch2029.write.Write;
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.JobBuilderFactory;
import org.springframework.batch.core.configuration.annotation.StepBuilderFactory;
import org.springframework.batch.core.launch.support.RunIdIncrementer;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class BatchConfig {    @Autowired
    public JobBuilderFactory  jobBuilderFactory;
    @Autowired
    public StepBuilderFactory  stepBuilderFactory;    @Bean
    public JobExecutionListener listener(){
        return  new JobCompletionLister();
    }    @Bean
    public Step orderStep1(){
        return  stepBuilderFactory.get("orderStep1").<String,String> chunk(1)
                .reader(new Reader()).processor(new Processor())
                .writer(new Write()).build();
    }    @Bean
    public Job processJob(){
        return jobBuilderFactory.get("processJob").incrementer(new RunIdIncrementer())
                .listener(listener()).flow(orderStep1()).end().build();
    }
}6、JobCompletionLister 
package com.sc.batch2029.listen;import org.springframework.batch.core.BatchStatus;
import org.springframework.batch.core.JobExecution;
import org.springframework.batch.core.listener.JobExecutionListenerSupport;
public class JobCompletionLister extends JobExecutionListenerSupport {    @Override
    public void beforeJob(JobExecution jobExecution) {
        if(jobExecution.getStatus()==BatchStatus.STARTED){
            System.out.println("批处理执行开始.........");
        }
    }    @Override
    public void afterJob(JobExecution jobExecution) {
        if(jobExecution.getStatus()==BatchStatus.COMPLETED){
            System.out.println("批处理执行结束.........");
        }
    }
}7、Processor 
package com.sc.batch2029.processor;import org.springframework.batch.item.ItemProcessor;
public class Processor implements ItemProcessor<String,String> {
    @Override
    public String process(String data) throws Exception {
        return data.toUpperCase();
    }
} 
8、JobInvokeController 
package com.sc.batch2029.controller;
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.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.web.bind.annotation.RestController;@RestController
@EnableScheduling
public class JobInvokeController {    @Autowired
    JobLauncher jobLauncher;
    @Autowired
    Job processJob;    @Scheduled(cron = "*/3 * * * * *")
    public  void  handle()throws Exception{
        JobParameters  jobParameters=new JobParametersBuilder()
                .addLong("time",System.currentTimeMillis()).toJobParameters();
        jobLauncher.run(processJob,jobParameters);
    }
}9、Batch2029Application 
package com.sc.batch2029;import org.springframework.batch.core.configuration.annotation.EnableBatchProcessing;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
@EnableBatchProcessing
public class Batch2029Application {    public static void main(String[] args) {
        SpringApplication.run(Batch2029Application.class, args);
    }}