springbatch 结合springboot 的一个demo

本文介绍了如何结合springbatch和springboot创建一个可配置的数据同步任务,旨在解决数据同步问题并方便后期维护。通过将任务拆分为不同step,包括读、处理和写数据,实现了任务的灵活配置。示例中展示了如何实现标准数据处理step和简单的邮件发送step,以及在springboot启动时自动构建任务流程。同时,项目还涉及到多数据源的切换。参考完整demo可在github上找到。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

springbatch 结合springboot 的一个demo

由于项目的需要引入了springbatch 来处理数据同步的问题。但由于一个任务的子任务多。。如果将每个job 都写死了都不利于后期的维护和修改。所以在前辈的基础上结合了springboot 实现了一个简单的可配置任务。
在这里就不对springbatch 做详细的描述关于springbatch可以参考:https://blog.youkuaiyun.com/kellypipe/article/details/83018416。
在这里插入图片描述
如图,在springbatch每一个任务都有不同的step组成。每一个step 可以拆解为 读数据 ,处理数据,写入数据 3 个步骤。如果你的任务不涉及读,处理,写 这种特点,只是简单的任务处理 springbatch 也提供了 tasklet 来处理任务。所以在demo中 整合这两者 ,实现在不修改原有任务, 进行任务step 的添加 ,删除,修改等。

下面就介绍下项目中使用的springbatch 同步数据的过程。(由于项目不方便对外,我删除了实际项目的业务部分,并结合一个简单的同步任务来说明问题:假设现在有个同步数据的场景:将元数据 进行计算处理后将结果更新到另外一个库中。写入成功后发送邮件 )

对于这个简单的任务首先拆解成两个step.
step01:标准的读取数据,处理数据,写入数据:对于这类的任务只要实现
step02: 这个step 只是用来发送邮件 .springbatch 也提供了tasklet 来处理这些不需要类似step01 那样复杂的操作。

在demo中对于step01 需要定义3 个步骤:读数据,处理数据,写入数据。例如:

 //定义读取bean
 /**
     * 任务一的数据读取
     * @param param1
     * @return
     */
    @Bean(name = "contactReader")
    @StepScope
    public MyBatisCursorItemReader getMyBatisCursorItemReader(@Value("#{jobParameters[param1]}") String param1){
        log.info("开始读取数据的demo01。。。。。。。");
        //如果查询需要条件可以从这里进行设置查询的条件
        Map condition = new HashMap();
        condition.put("param1",param1);
        MyBatisCursorItemReader myBatisCursorItemReader = new MyBatisCursorItemReader();
        myBatisCursorItemReader.setQueryId("selectAllUsers");
        myBatisCursorItemReader.setSqlSessionFactory(sqlSessionFactory);
        myBatisCursorItemReader.setParameterValues(condition);
        return myBatisCursorItemReader;
    }

/每个任务对应一个processor.每个process 需要注入读取数据和写入数据的bean
@Component
@OrderProcessor(jobName = "sampleJob",stepName = "sync_user_info",order = 3)
public class ContactItemProcessor extends CustomItemProcessor<User,UserTo> {

    @Autowired
    @Qualifier("contactReader")
    private MyBatisCursorItemReader myBatisCursorItemReader;

    @Autowired
    @Qualifier("contactWriter")
    private MyBatisBatchItemWriter myBatisBatchItemWriter;

    @Override
    public UserTo process(User user) {
        //模拟对user 进行处理
        UserTo userTo = new UserTo();
        BeanUtils.copyProperties(user,userTo);
        userTo.setName("任务一");
        return userTo;
    }

    @Override
    public ItemReader getItemReader() {
        return myBatisCursorItemReader;
    }

    @Override
    public ItemWriter getItemWriter() {
        return myBatisBatchItemWriter;
    }
}
// 写入数据的bean
/**
     * 任务一的写入
     * @return
     */
    @Bean
    @Qualifier("contactWriter")
    @StepScope
    public MyBatisBatchItemWriter getMyBatisCursorItemWriter(){
        log.info("开始写入数据。。。。。。。");
        MyBatisBatchItemWriter myBatisBatchItemWriter = new MyBatisBatchItemWriter();
        myBatisBatchItemWriter.setSqlSessionFactory(currentSqlSessionFactory);
        myBatisBatchItemWriter.setStatementId("hgp.demo.springbatch.dao.currentDbDao.UserToMapper.insert");
        return myBatisBatchItemWriter;
    }

在demo中对于step02的处理只需要实现AbstractTask ,然后实现自己的同步任务即可,如发邮件等。例如:

@Component
@OrderTask(jobName = "sampleJob",stepName = "tasklet01",order = 1)
public class Task01 extends AbstractTask {
    @Override
    public RepeatStatus execute(StepContribution stepContribution, ChunkContext chunkContext) throws Exception {
        System.out.println("tasklet01 开始执行任务...........");
        //处理自己的业务逻辑
        return RepeatStatus.FINISHED;
    }

在springboot 启动的时候会根据注解@OrderProcessor 来生成任务中的step01 和step02.
具体的参考demo(demo 还涉及到了多数据源的切换):https://github.com/kellypipe/springbatch-springboot-demo;

欢迎吐槽。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值