SpringBatch - MetaData, 年轻人不讲武德

前言

马保国男神, 混元形意太极拳掌门人, 在一次比武中, 年轻人不讲武德, 说打就打, 大意了没有闪而没有使出闪电五连鞭而被大家嘲讽

Spring Batch 统计性

在定时任务的运行过程中, 需要统计一些基本的数据, 比如本次运行的定时任务的入参, 任务读取, 处理, 跳过, 失败, 写入的次数这些关键数据

Spring Batch 例子

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们先定义一个数据源:

@Configuration
public class DataSourceConfig {

    @Bean("codogDb")
    @ConfigurationProperties(prefix = "spring.datasource.codog")
    @Primary
    public DataSource dataSource() {
        return DataSourceBuilder.create().build();
    }
}

配置我们的 springbatch 使用该数据源:

@Configuration
@EnableBatchProcessing
public class CodogBatchConfig implements BatchConfigurer {

    @Autowired
    @Qualifier("codogDb")
    private DataSource dataSource;

    @Autowired
    @Qualifier("codogJobLauncher")
    private JobLauncher jobLauncher;

    @Autowired
    @Qualifier("codogBatchTransactionManager")
    private PlatformTransactionManager platformTransactionManager;

    @Autowired
    @Qualifier("codogJobRepository")
    private JobRepository jobRepository;

    @Override
    public JobRepository getJobRepository() throws Exception {
        return jobRepository;
    }

    @Override
    public PlatformTransactionManager getTransactionManager() throws Exception {
        return platformTransactionManager;
    }

    @Override
    public JobLauncher getJobLauncher() throws Exception {
        return jobLauncher;
    }

    @Override
    public JobExplorer getJobExplorer() throws Exception {
        return null;
    }

    @Bean("codogJobRepository")
    public JobRepository jobRepository(PlatformTransactionManager batchTransactionManager) throws Exception {
        JobRepositoryFactoryBean factory = new JobRepositoryFactoryBean();
        factory.setDataSource(dataSource);
        factory.setTransactionManager(batchTransactionManager);
        factory.afterPropertiesSet();
        return factory.getObject();
    }

    @Bean("codogBatchTransactionManager")
    @Primary
    public PlatformTransactionManager batchTransactionManager() {
        return new ResourcelessTransactionManager();
    }

    @Bean("codogJobLauncher")
    public JobLauncher jobLauncher(@Qualifier("codogJobRepository") JobRepository jobRepository) throws Exception {
        SimpleJobLauncher simpleJobLauncher = new SimpleJobLauncher();
        simpleJobLauncher.setJobRepository(jobRepository);
        simpleJobLauncher.afterPropertiesSet();
        return simpleJobLauncher;
    }
}

定义一个男孩类用于读:

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Boy {
    private String name;
    private Integer age;
}

定义一个男孩的处理器:

@Component
public class BoyProcessor implements ItemProcessor<Boy, String> {

    @Override
    public String process(Boy boy) throws Exception {
        return (boy.getAge() < 5) ? "混元太急拳法伺候" : "年轻人不讲武德, 我大意了没有闪";
    }
}

拼装实际效果:

final String JOB_NAME = "demo4BaoguoMa";
List<Boy> boyList = new ArrayList<>();
for (int i = 0; i < 10; i++) {
    boyList.add(new Boy("boy" + i, i));
}
final ListReader<Boy> reader = new ListReader<>(boyList);
final Job girlJob = jobBuilderFactory.get(JOB_NAME)
    .flow(stepBuilderFactory.get(JOB_NAME)
        .<Boy, String>chunk(2).reader(reader)
        .processor(boyProcessor).writer(printWriter).build())
    .end().build();
jobLauncher.run(girlJob, new JobParametersBuilder()
    .addDate("start_time", new Date()).toJobParameters());

输出如下:

混元太急拳法伺候
混元太急拳法伺候
混元太急拳法伺候
混元太急拳法伺候
混元太急拳法伺候
年轻人不讲武德, 我大意了没有闪
年轻人不讲武德, 我大意了没有闪
年轻人不讲武德, 我大意了没有闪
年轻人不讲武德, 我大意了没有闪
年轻人不讲武德, 我大意了没有闪

我们观察两张表:

BATCH_JOB_EXECUTION_PARAMS job参数这表:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传BATCH_STEP_EXECUTION step执行情况的表:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传具体表的逻辑大家可以搭建下情况看看, 还是很好理解的

微信号:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值