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
相关推荐
JAVA面经实录91710 小时前
Spring AI 高频开发万能 Prompt 合集 + 生产级工具类
java·人工智能·spring·prompt
JAVA面经实录91710 小时前
如何选择适合项目的「限流 / 熔断 / 降级」方案
java·spring·kafka·sentinel·guava
曹牧21 小时前
Spring:@RequestMapping注解,匹配的顺序与上下文无关
java·后端·spring
Cry丶1 天前
架构师实战:Spring Authorization Server 落地企业级“无感” SSO(附设计映射与源码级接口剖析)
spring·spring security·oauth2.0·authorization·sso·无感登录
敖正炀1 天前
Spring 深度内核-核心容器与扩展机制-Spring 循环依赖终极剖析:三级缓存与 AOP 代理的纠缠
spring
超梦dasgg1 天前
Spring AI 智能航空助手项目实战
java·人工智能·后端·spring·ai编程
敖正炀1 天前
Spring 深度内核-核心容器与扩展机制-声明式事务的内部 AOP 实现:TransactionInterceptor 全解
spring
counting money1 天前
Spring框架基础(配置篇)
java·后端·spring
生活真难1 天前
SpringCloud - 任务调度 - xxl-job
后端·spring·spring cloud
敖正炀1 天前
Spring 深度内核-核心容器与扩展机制-AOP 进阶:AspectJ 集成、LTW 织入与工程实践
spring