SpringBatch - Reusability, 尾款人讲可复用性

335 阅读2分钟

前言

最近临近双十一了, 大家都变成尾款人了么, 这次主要解释下 Spring Batch 框架的组件可复用性

Spring Batch 可复用性

job 分为 step, step 分为 reader, processor, writer, 增加了不同的 job 之间输入/处理/输出能力的复用性

所以根据这个模型, 不同的 job 可以使用相同的已经定义好的 step, 不同的 step 和使用相同的已经定义好的 reader, processor 和 writer, 后者因为粒度小, 所以这种情况显然更常见

Spring Batch 可复用例子

假设我们有一些的商品(Commodity)付了预付款, 我们需要批量读取这些商品, 将每个商品按照购买的数量, 以一个商品一百元的价格付款, 让我们看看这个过程应该怎么用 Spring Batch 实现吧!

定义 Reader(与之前的文章相同的)

@Datapublic class ListReader<T> implements ItemReader<T> {    private List<T> sourceList;    private int index = 0;    @Override    public T read() throws Exception {        return sourceList.size() > index ? sourceList.get(index++) : null;    }}

定义 Processor(尾款人处理器,这次新写的)

@Componentpublic class FinalPaymentProcessor implements ItemProcessor<Commodity, String> {    @Override    public String process(Commodity commodity) throws Exception {        return "商品" + commodity.getName() + "付尾款了" + (commodity.getBuyerCount() * 100);    }}

定义 Writer(与之前的文章相同的)

@Componentpublic class PrintWriter implements ItemWriter<Object> {    @Override    public void write(List<?> list) throws Exception {        list.stream().forEach(System.out::println);    }}

拼装 Job

@Scheduled(cron = "0 0/1 * * * ?")public void demo4FinalPayments() throws Exception {    final String JOB_NAME = "demo4FinalPayments";    List<Commodity> commodityList = new ArrayList<>();    for (int i = 0; i < 10; i++) {        commodityList.add(new Commodity("商品" + i, i));    }    final ListReader<Commodity> reader = new ListReader<>(commodityList);    final Job girlJob = jobBuilderFactory.get(JOB_NAME)        .flow(stepBuilderFactory.get(JOB_NAME)            .<Commodity, String>chunk(2).reader(reader)            .processor(finalPaymentProcessor).writer(printWriter).build())        .end().build();    jobLauncher.run(girlJob, new JobParametersBuilder()        .addDate("start_time", new Date()).toJobParameters());}

输出:

商品商品0付尾款了0商品商品1付尾款了100商品商品2付尾款了200商品商品3付尾款了300商品商品4付尾款了400商品商品5付尾款了500商品商品6付尾款了600商品商品7付尾款了700商品商品8付尾款了800商品商品9付尾款了900

附录

可以运行的项目代码地址: github.com/currentpers…
本系列文章地址: github.com/currentpers…
设计模式系列文章地址: github.com/currentpers…
设计模式项目代码地址: github.com/currentpers…

微信原文: