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
相关推荐
大傻^1 小时前
Spring AI 2.0 企业级 RAG 架构:混合检索、重排序与多模态知识库
人工智能·spring·架构·多模态·rag·混合检索·重排序
大傻^2 小时前
Spring AI 2.0 多模型提供商配置:OpenAI、Gemini、Anthropic 与 Ollama 深度集成
java·人工智能·spring·springai
代码探秘者2 小时前
【大模型应用】6.RAG 场景下的向量+关键词混合检索
java·开发语言·人工智能·python·spring
NE_STOP2 小时前
SpringCloud快速入门--GateWay路由网关与Config配置中心
spring
毅炼3 小时前
Spring总结(2)
java·数据库·sql·spring
盐水冰4 小时前
【烘焙坊项目】后端搭建(13)- 数据统计--图形报表
java·后端·学习·spring
rainchestnut4 小时前
Spring AI 集成(3)-使用工具
spring
StackNoOverflow4 小时前
Spring MVC零散知识点记录
java·spring·mvc
rainchestnut4 小时前
Spring AI 初步集成(2)-添加记忆
spring