Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Spring Batch(4): Job具体解释[通俗易懂]

Spring Batch(4): Job具体解释[通俗易懂]

作者头像
全栈程序员站长
发布于 2022-07-29 13:53:06
发布于 2022-07-29 13:53:06
83400
代码可运行
举报
运行总次数:0
代码可运行

大家好,又见面了,我是你们的朋友全栈君。

第四章 配置作业Job

4.1 基本配置

Job的配置有3个必须的属性。name,jobRepository,steps。一个简单的Job配置例如以下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<job id="footballJob">
    <step id="playerload" parent="s1" next="gameLoad"/>
    <step id="gameLoad" parent="s2" next="playerSummarization"/>
    <step id="playerSummarization" parent="s3"/>
</job>

jobRepository默认引用名称为jobRepository的bean,当然也能够显式地配置:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<job id="footballJob" job-repository="specialRepository">
    <step id="playerload" parent="s1" next="gameLoad"/>
    <step id="gameLoad" parent="s3" next="playerSummarization"/>
    <step id="playerSummarization" parent="s3"/>
</job>
4.1.1 Restartable属性

该属性定义Job能否够被重新启动,默觉得true,在JobExecution运行失败后,能够创建还有一个JobExecution来继续上次的运行。

可是假设该属性设为false。又一次运行该JobInstance将抛出异常。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<job id="footballJob" restartable="false">
    ...
</job>
4.1.2 拦截Job运行

Spring Batch在Job的生命周期中提供了一些钩子方法,可这些钩子方法通过Listener的形式提供。JobListener的接口定义例如以下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public interface JobExecutionListener { 
      

    void beforeJob(JobExecution jobExecution);

    void afterJob(JobExecution jobExecution);

}

通过实现JobExecutionListener接口并配置给Job,能够在Job运行前后运行特定的逻辑。

比如在运行结束之后。假设失败,发送邮件通知管理人员等。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<job id="footballJob">
    <step id="playerload" parent="s1" next="gameLoad"/>
    <step id="gameLoad" parent="s2" next="playerSummarization"/>
    <step id="playerSummarization" parent="s3"/>
    <listeners>
        <listener ref="sampleListener"/>
    </listeners>
</job>

须要注意的是。不管Job是否成功运行,afterJob方法都会运行。Job是否运行成功,能够从JobExecution中获取。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public void afterJob(JobExecution jobExecution){
    if( jobExecution.getStatus() == BatchStatus.COMPLETED ){
        //job success
    }
    else if(jobExecution.getStatus() == BatchStatus.FAILED){
        //job failure
    }
}

Listener的运行顺序: beforeJob与配置的顺序一样,afterJob与配置的顺序相反。

Listener异常: Listener的运行过程中假设抛出异常,将导致Job无法继续完毕,终于状态为FAILED.因此要合理控制Listener异常对业务的影响。

注解支持: 假设不想使用侵入性强的Listener接口,能够使用@BeforeJob和@AfterJob两个注解声明。

4.1.3 Job抽象与继承

通用的Job配置能够抽取出来,作为抽象的Job存在,抽象的Job不同意被实例化:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<job id="baseJob" abstract="true">
    <listeners>
        <listener ref="listenerOne"/>
    <listeners>
</job>

子Job能够通过继续共用这些配置(当然。也能够继承非抽象的Job)。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<job id="job1" parent="baseJob">
    <step id="step1" parent="standaloneStep"/>

    <listeners merge="true">
        <listener ref="listenerTwo"/>
    <listeners>
</job>

当中的merge=”true”表示合并父job和子job的配置,也就是两个Listener都生效。同常规的Spring配置。

4.1.4 Job參数验证

JobParameterValidator组件用于验证JobParameter。

通过以下配置为job配置验证器:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<job id="job1" parent="baseJob3">
    <step id="step1" parent="standaloneStep"/>
    <validator ref="paremetersValidator"/>
</job>
4.1.4 属性的Late Binding

在Spring中。能够把Bean配置用到的属性值通过PropertiesPlaceHolderConfiguer把属性从配置中分离出来独立管理,理论上来说,在配置Job的时候也能够使用同样的方式。可是Spring Batch提供了在运行时配置參数值的能力:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<bean:property name="filePath" value="#{jobParameters['filePath']}" />

在启动Job时:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    launcher.executeJob("job.xml" , "footjob",
        new JobParametersBuilder().addDate("day", new Date()))
                                  .addString("filePath", "/opt/data/test.xml"));
4.2 配置JobRepository

JobRepository为任务框架中的各个组件对象提供CRUD操作,比如JobExecution,StepExecution。 一个配置样例例如以下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<job-repository id="jobRepository" data-source="dataSource" transaction-manager="transactionManager" isolation-level-for-create="SERIALIZABLE" table-prefix="BATCH_" max-varchar-length="1000"/>
4.2.1 事务配置

JobRepository的操作须要事务来保证其完整性以及正确性,这些元数据的完整性对框架来说非常重要。假设没有事务支持。框架的行为将无法正确定义。 create*方法的事务隔离级别单独定义,为了保证同一个JobInstance不会被同一时候运行两次,默认的隔离级别为SERIALIZABLE。能够被改动:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<job-repository id="jobRepository" isolation-level-for-create="REPEATABLE_READ" />

假设没有使用Batch命名空间或者没有使用Factory Bean,则须要显示配置事务AOP:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<aop:config>
    <aop:advisor  pointcut="execution(* org.springframework.batch.core..*Repository+.*(..))"/>
    <advice-ref="txAdvice" />
</aop:config>

<tx:advice id="txAdvice" transaction-manager="transactionManager">
    <tx:attributes>
        <tx:method name="*" />
    </tx:attributes>
</tx:advice>
4.2.2 表名前缀

默认情况下,Spring Batch须要的表以BATCH作为前缀,只是能够自己定义:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<job-repository id="jobRepository" table-prefix="e_batch" />

表前缀能够改动,可是表名和表的列不能被改动。

4.2.3 特殊的Repository

測试环境中。内存级别的数据库十分方便:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<bean id="jobRepository" class="org.springframework.batch.core.repository.support.MapJobRepositoryFactoryBean">
    <property name="transactionManager" ref="transactionManager"/>
</bean>

假设使用的数据库类型不在SpringBatch的支持中,能够通过JobRepositoryFactoryBean自己定义。

4.3 配置JobLauncher

默认提供了一个简单的Launcher:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<bean id="jobLauncher" class="org.springframework.batch.core.launch.support.SimpleJobLauncher">
    <property name="jobRepository" ref="jobRepository" />
</bean>

JobLauncher的时序图例如以下:

假设启动的请求来自HTTP,那么等待整个Job完毕再返回不是一个好方法。此时须要异步启动Job,时序图例如以下:

对应的Launcher配置例如以下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<bean id="jobLauncher" class="org.springframework.batch.core.launch.support.SimpleJobLauncher">
    <property name="jobRepository" ref="jobRepository" />
    <property name="taskExecutor">
        <bean class="org.springframework.core.task.SimpleAsyncTaskExecutor" />
    </property>
</bean>
4.4 运行Job

有多种方式能够启动一个Job。可是核心都是通过JobLauncher来实现。 1. 命令行运行 主要通过CommandLineJobRunner类完毕

2. 从Web容器中运行 通过Http请求启动任务非经常见。时序图例如以下:

Controller能够是常规的Spring MVC Controller:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Controller
public class JobLauncherController { 
      

    @Autowired
    JobLauncher jobLauncher;

    @Autowired
    Job job;

    @RequestMapping("/jobLauncher.html")
    public void handle() throws Exception{
        jobLauncher.run(job, new JobParameters());
    }
}

3. 使用调度框架运行 能够与其它调度框架一起使用,比如使用Spring的轻量级调用框架Spring Scheduler或者Quartz

4.5 元数据的高级使用方法

除了通过JobRepository对元数据进行CRUD操作外,Spring batch还提供另外的接口用于訪问元数据。 包含: JobExplorer JobOperator。

总体结构例如以下:

4.5.1 JobExplorer

该组件提供了仅仅读的查询操作,是JobRepository的仅仅读版本号,接口定义例如以下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public interface JobExplorer { 
      

    List<JobInstance> getJobInstances(String jobName, int start, int count);

    JobExecution getJobExecution(Long executionId);

    StepExecution getStepExecution(Long jobExecutionId, Long stepExecutionId);

    JobInstance getJobInstance(Long instanceId);

    List<JobExecution> getJobExecutions(JobInstance jobInstance);

    Set<JobExecution> findRunningJobExecutions(String jobName);
}

配置一个Bean例如以下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<bean id="jobExplorer" class="org.spr...JobExplorerFactoryBean" p:dataSource-ref="dataSource" />

假设须要制定表名前缀:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<bean id="jobExplorer" class="org.spr...JobExplorerFactoryBean" p:dataSource-ref="dataSource" p:tablePrefix="BATCH_" />
4.5.2 JobOperator

JobOperator集成了非常多接口定义,提供了综合的操作方法。定义例如以下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public interface JobOperator { 
      

    List<Long> getExecutions(long instanceId) throws NoSuchJobInstanceException;

    List<Long> getJobInstances(String jobName, int start, int count)
          throws NoSuchJobException;

    Set<Long> getRunningExecutions(String jobName) throws NoSuchJobException;

    String getParameters(long executionId) throws NoSuchJobExecutionException;

    Long start(String jobName, String parameters)
          throws NoSuchJobException, JobInstanceAlreadyExistsException;

    Long restart(long executionId)
          throws JobInstanceAlreadyCompleteException, NoSuchJobExecutionException,
                  NoSuchJobException, JobRestartException;

    Long startNextInstance(String jobName)
          throws NoSuchJobException, JobParametersNotFoundException, JobRestartException,
                 JobExecutionAlreadyRunningException, JobInstanceAlreadyCompleteException;

    boolean stop(long executionId)
          throws NoSuchJobExecutionException, JobExecutionNotRunningException;

    String getSummary(long executionId) throws NoSuchJobExecutionException;

    Map<Long, String> getStepExecutionSummaries(long executionId)
          throws NoSuchJobExecutionException;

    Set<String> getJobNames();

}

配置:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<bean id="jobOperator" class="org.spr...SimpleJobOperator">
    <property name="jobExplorer">
        <bean class="org.spr...JobExplorerFactoryBean">
            <property name="dataSource" ref="dataSource" />
        </bean>
    </property>
    <property name="jobRepository" ref="jobRepository" />
    <property name="jobRegistry" ref="jobRegistry" />
    <property name="jobLauncher" ref="jobLauncher" />
</bean>

当中的startNextInstance方法将使用当前Job的JobParameter。经过JobParametersIncrementer处理之后的參数启动一个JobInstance。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public interface JobParametersIncrementer { 
      

    JobParameters getNext(JobParameters parameters);

}

以下是一个简单实现:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class SampleIncrementer implements JobParametersIncrementer { 
      

    public JobParameters getNext(JobParameters parameters) {
        if (parameters==null || parameters.isEmpty()) {
            return new JobParametersBuilder().addLong("run.id", 1L).toJobParameters();
        }
        long id = parameters.getLong("run.id",1L) + 1;
        return new JobParametersBuilder().addLong("run.id", id).toJobParameters();
    }
}

为job配置incrementer:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<job id="footballJob" incrementer="sampleIncrementer">
    ...
</job>

在每天处理一次的批处理中,Incrementer的实现可能是按日期递增。

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/129774.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年4月1,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Spring Batch(2)——Job配置与运行
在 Spring Batch(1)——数据批处理概念 文中介绍了批处理的概念以及Spring Batch相关的使用场景,后续将会陆续说明在代码层面如何使用。
随风溜达的向日葵
2019/07/08
4.5K1
批处理框架 Spring Batch 这么强,你会用吗?
spring batch是spring提供的一个数据处理框架。企业域中的许多应用程序需要批量处理才能在关键任务环境中执行业务操作。这些业务运营包括:
Java小咖秀
2021/07/12
1.5K0
Spring Batch 批处理(8) - JobLauncher和JobOperator
在成功创建一个job后,Spring Batch 默认在项目启动时候执行配置的job。往往在正常业务处理中,需要我们手动或者定时去触发job,所以这边便引入了jobLauncher、jobOperator两个执行器。
chenchenchen
2020/05/26
3.6K0
Spring Batch 批处理框架,真心强啊!!
点击上方“芋道源码”,选择“设为星标” 管她前浪,还是后浪? 能浪的浪,才是好浪! 每天 10:33 更新文章,每天掉亿点点头发... 源码精品专栏 原创 | Java 2021 超神之路,很肝~ 中文详细注释的开源项目 RPC 框架 Dubbo 源码解析 网络应用框架 Netty 源码解析 消息中间件 RocketMQ 源码解析 数据库中间件 Sharding-JDBC 和 MyCAT 源码解析 作业调度中间件 Elastic-Job 源码解析 分布式事务中间件 TCC-Transaction
芋道源码
2022/07/19
1.5K0
Spring Batch 批处理框架,真心强啊!!
【Spring底层原理高级进阶】Spring Batch清洗和转换数据,一键处理繁杂数据!Spring Batch是如何实现IO流优化的?本文详解!
批处理是企业级业务系统不可或缺的一部分,spring batch是一个轻量级的综合性批处理框架,可用于开发企业信息系统中那些至关重要的数据批量处理业务.SpringBatch基于POJO和Spring框架,相当容易上手使用,让开发者很容易地访问和利用企业级服务.spring batch具有高可扩展性的框架,简单的批处理,复杂的大数据批处理作业都可以通过SpringBatch框架来实现。
苏泽
2024/03/10
9260
【Spring底层原理高级进阶】Spring Batch清洗和转换数据,一键处理繁杂数据!Spring Batch是如何实现IO流优化的?本文详解!
Spring Batch 详解
调用这个Job Launcher方法:可以通过java程序来通过JobLauncher来启动,也可以通过定时任务例如Quartz scheduler来启动.
全栈程序员站长
2022/08/24
8950
Spring Batch 批处理(3) - Job、Flow、Split
在成功创建一个job后,Spring Batch 默认在项目启动时候执行配置的job。往往在正常业务处理中,需要我们手动或者定时去触发job,所以这边便引入了jobLauncher、jobOperator两个执行器。
chenchenchen
2020/05/26
1.9K0
Spring Batch(1)——数据批处理概念
Spring Batch为批处理提供了一个轻量化的解决方案,它根据批处理的需要迭代处理各种记录,提供事物功能。但是Spring Batch仅仅适用于"脱机"场景,在处理的过程中不能和外部进行任何交互,也不允许有任何输入。
随风溜达的向日葵
2019/07/04
2K0
Spring Batch(1)——数据批处理概念
Spring Batch批处理框架,真心强啊!!
Spring Batch 是 Spring 提供的一个数据处理框架。企业域中的许多应用程序需要批量处理才能在关键任务环境中执行业务操作。
终码一生
2022/10/28
1.2K0
Spring Batch批处理框架,真心强啊!!
SpringBatch文档
Spring Batch 是一个轻量级的、完善的批处理框架,旨在帮助企业建立健壮、高效的批处理应用。
全栈程序员站长
2022/09/01
5.5K0
Spring Batch 批处理(1) - 简介及使用场景
Spring Batch 作为 Spring 的子项目,是一款基于 Spring 的企业批处理框架。通过它可以构建出健壮的企业批处理应用。Spring Batch 不仅提供了统一的读写接口、丰富的任务处理方式、灵活的事务管理及并发处理,同时还支持日志、监控、任务重启与跳过等特性,大大简化了批处理应用开发,将开发人员从复杂的任务配置管理过程中解放出来,使他们可以更多地去关注核心的业务处理过程。
chenchenchen
2020/05/27
5.6K0
Spring Batch之批处理实践
Spring Batch 是Spring的子项目,基于Spring的批处理的框架,通过其可以构建出批量的批处理框架。
mySoul
2020/06/17
9830
批处理框架 Spring Batch 这么强,你真的会用吗?
概念词就不多说了,我简单地介绍下 , spring batch 是一个 方便使用的 较健全的 批处理 框架。
用户1220090
2025/05/08
3190
批处理框架 Spring Batch 这么强,你真的会用吗?
springbatch 批处理框架的介绍
Spring Batch 是什么? 官网中介绍 Spring Batch is a lightweight, comprehensive batch framework designed to enable the development of robust batch applications vital for the daily operations of enterprise systems.(一款轻量的、全面的批处理框架,用于开发强大的日常运营的企业级批处理应用程序。)相对于他的特点定义我们肯定更倾向于他的使用的业务场景以及他是如何运作的。下面的篇幅将介绍整个springbatch的使用业务场景和它的结构原理以及如何去使用它们(最后会通过一个demo来演示)。 springbatch结合springboot 的demo:https://github.com/kellypipe/springbatch-springboot-demo
全栈程序员站长
2022/09/02
1.4K0
Spring Batch(4)——Item概念及使用代码
在 批处理概念 中介绍一个标准的批处理分为 Job 和 Step。本文将结合代码介绍在Step中Reader、Processor、Writer的实际使用。
随风溜达的向日葵
2019/07/10
1.9K0
Spring Batch快速入门
Spring Batch简单来说就是一个轻量级的批处理框架,从名字就可以知道它是Spring 的子项目。我们在企业开发中可能会面临到一些需要处理较大数据量的场景,例如将一个表的全部数据导入到另一张表结构类似的表中、批量读取一个或多个文件内容并写入到数据库中,又或者将一张表的数据批量更新到另一张表中。而Spring Batch可以帮助我们快速的开发这种场景下的批处理应用程序。
端碗吹水
2020/09/23
2K0
Spring Batch快速入门
Spring Batch实战(一)
虽然开源软件项目和相关社区把更多的注意力集中在基于web和微服务的体系结构框架上,但明显缺乏对可重用体系结构框架的关注,以适应基于java的批处理需求,尽管仍然需要在企业IT环境中处理此类处理。缺乏标准的、可重用的批处理体系结构导致了在客户企业IT功能中开发的许多一次性的内部解决方案的激增。
xdd
2022/07/12
1.8K0
Spring Batch实战(一)
Spring Batch实战(二)
在Spring Batch中,Job只是Step实例的容器。它将在逻辑上属于一个流的多个步骤组合在一起,并允许配置所有步骤的全局属性,比如可重新启动性。作业配置包含:
xdd
2022/07/12
1K0
Spring Batch实战(二)
Spring Cloud Task 高级特性Task Batch Jobs
Spring Cloud Task是一个轻量级的框架,用于在Spring Boot应用程序中运行短期任务。它提供了一种简单的方式来管理和监控这些任务,同时还可以与Spring Batch集成,以支持批量处理任务。在本文中,我们将重点介绍Spring Cloud Task的高级特性之一:Task Batch Jobs。
堕落飞鸟
2023/04/17
6840
SpringBoot:使用Spring Batch实现批处理任务
在企业级应用中,批处理任务是不可或缺的一部分。它们通常用于处理大量数据,如数据迁移、数据清洗、生成报告等。Spring Batch是Spring框架的一部分,专为批处理任务设计,提供了简化的配置和强大的功能。本文将介绍如何使用Spring Batch与SpringBoot结合,构建和管理批处理任务。
E绵绵
2024/07/03
1.1K0
相关推荐
Spring Batch(2)——Job配置与运行
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验