spring batch动态示例

文章目录

JobController

java 复制代码
@RestController
public class JobController {

    @Autowired(required = false)
    private JobLauncher msgJobLauncher4;

    @Autowired(required = false)
    private Job msgJob4;

    @RequestMapping("msgJob4")
    public String msgJob4() {
        try {
            JobExecution jobExecution = msgJobLauncher4.run(msgJob4, new JobParametersBuilder()
                    .addString("time", System.currentTimeMillis() + "")
                    .toJobParameters());
            return "ok";
        } catch (JobExecutionAlreadyRunningException | JobRestartException | JobInstanceAlreadyCompleteException |
                 JobParametersInvalidException e) {
            throw new RuntimeException(e);
        }
    }

    @Autowired(required = false)
    private JobLauncher msgJobLauncher5;

    @Autowired(required = false)
    private Job msgJob5;

    @RequestMapping("msgJob5")
    public String msgJob5(@RequestParam(name = "key", defaultValue = "dft") String key) {
        try {
            JobExecution jobExecution = msgJobLauncher5.run(msgJob5, new JobParametersBuilder()
                    .addString("time", System.currentTimeMillis() + "")
                    .addString("key", key)
                    .toJobParameters());
            return "ok";
        } catch (JobExecutionAlreadyRunningException | JobRestartException | JobInstanceAlreadyCompleteException |
                 JobParametersInvalidException e) {
            throw new RuntimeException(e);
        }
    }

}

ReadFlatFileMsgJobConfig5

java 复制代码
@Configuration
public class ReadFlatFileMsgJobConfig5 {

    @Autowired
    private JobRepository jobRepository;

    @Autowired
    private PlatformTransactionManager txm;

    @Autowired
    private MsgMapper msgMapper;

    @Bean
    public JobLauncher msgJobLauncher5() {
        TaskExecutorJobLauncher jobLauncher = new TaskExecutorJobLauncher();
        jobLauncher.setJobRepository(jobRepository);
        return jobLauncher;
    }

    @Bean
    public Job msgJob5() {
        return new JobBuilder("msgJob5", jobRepository)
                .start(msgStep5())
                .build();
    }

    private Step msgStep5() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(1);
        executor.setMaxPoolSize(1);
        executor.afterPropertiesSet();

        return new StepBuilder("msgStep5", jobRepository)
                .<Person, Person>chunk(1, txm)
                .reader(msgReader5(null))
                .processor(msgProcessor5())
                .writer(msgWriter5())
                .taskExecutor(executor)
                .faultTolerant()
                .skip(Exception.class)
                .skipLimit(3)
                .build();
    }

    @Bean
    @StepScope // 必须声明为ItemStreamReader,否则会报错
    public ItemStreamReader<Person> msgReader5(
    	// 动态获取job的执行参数
    	@Value("#{jobParameters['key']}") String key
   	) {

        Properties props = new Properties();

        String readFileName = "person.txt";
        try {
        	// 动态读取文件中配置的属性名
            props.load(new FileReader(System.getProperty("user.dir") + "\\file\\file.properties"));
            readFileName = props.getProperty("readFileName");
        } catch (IOException e) {
            throw new RuntimeException(e);
        }

        FlatFileItemReader<Person> itemReader = new FlatFileItemReaderBuilder<Person>()
            .name("msgReader5")
            .resource(new FileSystemResource(new File(System.getProperty("user.dir") + "\\file\\" + readFileName)))
            .delimited()
            .names("id", "name", "age")
            .targetType(Person.class)
            .build();

        System.out.println("create msgReader5..." + itemReader + "key: " + key);

        return itemReader;
    }

    private ItemProcessor<Person, Person> msgProcessor5() {
        return new ItemProcessor<Person, Person>() {
            @Override
            public Person process(Person item) throws Exception {
                System.out.println("processor->" + item);
                return item;
            }
        };
    }

    private ItemWriter<Person> msgWriter5() {
        return new ItemWriter<Person>() {
            @Override
            public void write(Chunk<? extends Person> chunk) throws Exception {
                System.out.println(chunk);
            }
        };
    }
    
}

WriteFlatFileMsgJobConfig4

java 复制代码
@Slf4j
@Configuration
public class WriteFlatFileMsgJobConfig4 {

    @Autowired
    private JobRepository jobRepository;

    @Autowired
    private PlatformTransactionManager txm;

    @Autowired
    private MsgMapper msgMapper;

    @Bean
    public JobLauncher msgJobLauncher4() {
        TaskExecutorJobLauncher jobLauncher = new TaskExecutorJobLauncher();
        jobLauncher.setJobRepository(jobRepository);
        return jobLauncher;
    }

    @Bean
    public Job msgJob4() {
        return new JobBuilder("msgJob4", jobRepository)
                .start(msgStep4())
                .build();
    }

    private Step msgStep4() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(1);
        executor.setMaxPoolSize(1);
        executor.afterPropertiesSet();

        return new StepBuilder("msgStep4", jobRepository)
                .<Person, Person>chunk(1, txm)
                .reader(msgReader4())
                .processor(msgProcessor4())
                .writer(msgWriter4())
                .taskExecutor(executor)
                .faultTolerant()
                .skip(Exception.class)
                .skipLimit(3)
                .build();
    }

    @Bean
    @StepScope
    public ItemReader<Person> msgReader4() {

        ItemReader<Person> itemReader = new ItemReader<>() {
            private int num = 1;
            private static final int DEFAULT_MAX_NUM = 5;

            @Override
            public Person read() throws Exception {
                synchronized (this) {
                    if (num <= DEFAULT_MAX_NUM) {
                        Person person = new Person();
                        person.setId(num);
                        person.setName("zzhua" + num);
                        person.setAge(new Random().nextInt(30));
                        System.out.println(person);
                        num++;
                        return person;
                    }
                    return null;
                }
            }
        };

        System.out.println("create msgReader4...: " + itemReader);

        return itemReader;
    }

    private ItemProcessor<Person, Person> msgProcessor4() {
        return new ItemProcessor<Person, Person>() {
            @Override
            public Person process(Person item) throws Exception {
                return item;
            }
        };
    }

    private ItemWriter<Person> msgWriter4() {
        return new FlatFileItemWriterBuilder<Person>()
                .name("msgWriter4")
                .delimited()
                .names("id", "name", "age")
                .resource(new FileSystemResource(new File(System.getProperty("user.dir") + "\\file\\person.txt")))
                .build();
    }

}

file.properties

properties 复制代码
readFileName=person.txt
相关推荐
步行cgn1 天前
StringHttpMessageConverter 详解:Spring MVC 中字符串读写的默认转换器
java·spring·mvc
步行cgn1 天前
@ResponseBody 详解:Spring MVC 中把返回值直接写入响应体
java·spring·mvc
萧瑟余晖1 天前
Spring Data综合实战与调优详解
java·后端·spring
蒋胜山1 天前
VBScript007-Excel的99乘法表
经验分享·batch
郭小李2 天前
spring 的 @CookieValue 注解 用法
java·后端·spring
屈冠成2 天前
ShopXO商城系统测试报告
开发语言·spring·maven·lua
w_t_y_y2 天前
JWT(5)JWT+spring security
java·后端·spring
会编程的吕洞宾2 天前
Spring Boot 镜像瘦身实战:从 450MB 瘦到 180MB
java·后端·spring
小溪学编程2 天前
Spring @Bean 与 @Component 注解的区别详解
java·后端·spring
Brilliantwxx2 天前
【Linux】 文件访问与路径解析:目录、文件名、dentry、路径缓冲与 dcache 全解析
linux·运维·服务器·开发语言·spring