zoukankan      html  css  js  c++  java
  • Spring Batch 批处理框架介绍

    前言

    在大型的企业应用中,或多或少都会存在大量的任务需要处理,如邮件批量通知所有将要过期的会员,日终更新订单信息等。而在批量处理任务的过程中,又需要注意很多细节,如任务异常、性能瓶颈等等。那么,使用一款优秀的框架总比我们自己重复地造轮子要好得多一些。

    正式介绍

    Spring Batch在官网是这样一句话介绍自己的:A lightweight, comprehensive batch framework designed to enable the development of robust batch applications vital for the daily operations of enterprise systems.(一款轻量的、全面的批处理框架,用于开发强大的日常运营的企业级批处理应用程序。)

    框架主要有以下功能:

    • Transaction management(事务管理)
    • Chunk based processing(基于块的处理)
    • Declarative I/O(声明式的输入输出)
    • Start/Stop/Restart(启动/停止/再启动)
    • Retry/Skip(重试/跳过)

    如果你的批处理程序需要使用上面的功能,那就大胆地使用它吧!

    框架全貌

    框架一共有4个主要角色:JobLauncher是任务启动器,通过它来启动任务,可以看做是程序的入口。Job代表着一个具体的任务。Step代表着一个具体的步骤,一个Job可以包含多个Step(想象把大象放进冰箱这个任务需要多少个步骤你就明白了)。JobRepository是存储数据的地方,可以看做是一个数据库的接口,在任务执行的时候需要通过它来记录任务状态等等信息。

    JobLauncher

    JobLauncher是任务启动器,该接口只有一个run方法:

    1
    2
    3
    4
    5
    public interface JobLauncher {
     
        public JobExecution run(Job job, JobParameters jobParameters) throws JobExecutionAlreadyRunningException, JobRestartException, JobInstanceAlreadyCompleteException, JobParametersInvalidException;
     
    }

    除了传入Job对象之外,还需要传入JobParameters对象,后续讲到Job再解释为什么要多传一个JobParameters。通过JobLauncher可以在Java程序中调用批处理任务,也可以通过命令行或者其他框架(如定时调度框架Quartz、Web后台框架Spring MVC)中调用批处理任务。Spring Batch框架提供了一个JobLauncher的实现类SimpleJobLauncher。

    Job

    Job代表着一个任务,一个Job与一个或者多个JobInstance相关联,而一个JobInstance又与一个或者多个JobExecution相关联:

    考虑到任务可能不是只执行一次就再也不执行了,更多的情况可能是定时任务,如每天执行一次,每个星期执行一次等等,那么为了区分每次执行的任务,框架使用了JobInstance。如上图所示,Job是一个EndOfDay(每天最后时刻执行的任务),那么其中一个JobInstance就代表着2007年5月5日那天执行的任务实例。框架通过在执行JobLauncher.run(Job, JobParameters)方法时传入的JobParameters来区分是哪一天的任务。

    由于2007年5月5日那天执行的任务可能不会一次就执行完成,比如中途被停止,或者出现异常导致中断,需要多执行几次才能完成,所以框架使用了JobExecution来表示每次执行的任务。

    Step

    一个Job任务可以分为几个Step步骤,与JobExection相同,每次执行Step的时候使用StepExecution来表示执行的步骤。每一个Step还包含着一个ItemReader、ItemProcessor、ItemWriter,下面分别介绍这三者。

    ItemReader

    ItemReader代表着读操作,其接口如下:

    1
    2
    3
    4
    5
    public interface ItemReader<T> {
     
        T read() throws Exception, UnexpectedInputException, ParseException, NonTransientResourceException;
     
    }

    框架已经提供了多种ItemReader接口的实现类,包括对文本文件、XML文件、数据库、JMS消息等读的处理,当然我们也可以自己实现该接口。

    ItemProcessor

    ItemProcessor 代表着处理操作,其接口如下:

    1
    2
    3
    4
    5
    public interface ItemProcessor<I, O> {
     
        O process(I item) throws Exception;
     
    }

    process方法的形参传入I类型的对象,通过处理后返回O型的对象。开发者可以实现自己的业务代码来对数据进行处理。

    ItemWriter

    ItemReader代表着写操作,其接口如下:

    1
    2
    3
    4
    5
    public interface ItemWriter<T> {
     
        void write(List<? extends T> items) throws Exception;
     
    }

    框架已经提供了多种ItemWriter接口的实现类,包括对文本文件、XML文件、数据库、JMS消息等写的处理,当然我们也可以自己实现该接口。

    JobRepository

    JobRepository用于存储任务执行的状态信息,比如什么时间点执行了什么任务、任务执行结果如何等等。框架提供了2种实现,一种是通过Map形式保存在内存中,当Java程序重启后任务信息也就丢失了,并且在分布式下无法获取其他节点的任务执行情况;另一种是保存在数据库中,并且将数据保存在下面6张表里:

    • BATCH_JOB_INSTANCE
    • BATCH_JOB_EXECUTION_PARAMS
    • BATCH_JOB_EXECUTION
    • BATCH_STEP_EXECUTION
    • BATCH_JOB_EXECUTION_CONTEXT
    • BATCH_STEP_EXECUTION_CONTEXT

    Spring Batch框架的JobRepository支持主流的数据库:DB2、Derby、H2、HSQLDB、MySQL、Oracle、PostgreSQL、SQLServer、Sybase。可爱的是,我司的Gauss数据库也是支持的,只不过需要稍加配置。

    总结

    本篇博客先通过一个批量下发命令的Demo教大家如何快速入门,再对框架进行一个从整体到部分的介绍,让大家有一个基础的认识。由于篇幅和能力有限,关于Spring Batch框架的内部实现细节和高级特性无法面面俱到,感兴趣的小伙伴可以阅读源码或者查阅官网文档和书籍(“参考阅读”章节已提供)。

    参考阅读

    转载请注明地址:http://www.importnew.com/26177.html

  • 相关阅读:
    css水平垂直居中
    JavaScript提供了哪几种“异步模式”?
    sort()
    后端开发中,可以在Cache-Control设置的常用指令
    纯函数
    react和vue
    npm(classnames) 更灵活使用类名
    shell知多少?
    常见的HTTP状态码
    axios
  • 原文地址:https://www.cnblogs.com/renyuanwei/p/9358765.html
Copyright © 2011-2022 走看看