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

第四章配置作业Job4.1基本配置Job的配置有3个必须的属性。name,jobRepository,steps。一个简单的Job配置例如以下:<jobid="footballJob"><stepid="playerload"parent="s1"next="gameLoad"/>&a

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

第四章 配置作业Job

4.1 基本配置

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

<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,当然也能够显式地配置:

<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将抛出异常。

<job id="footballJob" restartable="false">
    ...
</job>
4.1.2 拦截Job运行

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

public interface JobExecutionListener { 
      

    void beforeJob(JobExecution jobExecution);

    void afterJob(JobExecution jobExecution);

}

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

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

<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中获取。

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不同意被实例化:

<job id="baseJob" abstract="true">
    <listeners>
        <listener ref="listenerOne"/>
    <listeners>
</job>

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

<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配置验证器:

<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提供了在运行时配置參数值的能力:

<bean:property name="filePath" value="#{jobParameters['filePath']}" />

在启动Job时:

    launcher.executeJob("job.xml" , "footjob",
        new JobParametersBuilder().addDate("day", new Date()))
                                  .addString("filePath", "/opt/data/test.xml"));

4.2 配置JobRepository

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

<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。能够被改动:

<job-repository id="jobRepository" isolation-level-for-create="REPEATABLE_READ" />

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

<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作为前缀,只是能够自己定义:

<job-repository id="jobRepository" table-prefix="e_batch" />

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

4.2.3 特殊的Repository

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

<bean id="jobRepository" class="org.springframework.batch.core.repository.support.MapJobRepositoryFactoryBean">
    <property name="transactionManager" ref="transactionManager"/>
</bean>

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

4.3 配置JobLauncher

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

<bean id="jobLauncher" class="org.springframework.batch.core.launch.support.SimpleJobLauncher">
    <property name="jobRepository" ref="jobRepository" />
</bean>

JobLauncher的时序图例如以下:

这里写图片描写叙述

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

这里写图片描写叙述

对应的Launcher配置例如以下:

<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:

@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的仅仅读版本号,接口定义例如以下:

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例如以下:

<bean id="jobExplorer" class="org.spr...JobExplorerFactoryBean" p:dataSource-ref="dataSource" />

假设须要制定表名前缀:

<bean id="jobExplorer" class="org.spr...JobExplorerFactoryBean" p:dataSource-ref="dataSource" p:tablePrefix="BATCH_" />
4.5.2 JobOperator

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

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();

}

配置:

<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。

public interface JobParametersIncrementer { 
      

    JobParameters getNext(JobParameters parameters);

}

以下是一个简单实现:

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:

<job id="footballJob" incrementer="sampleIncrementer">
    ...
</job>

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

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

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • java responsebody_SpringBoot ResponseBody返回值处理的实现「建议收藏」

    java responsebody_SpringBoot ResponseBody返回值处理的实现「建议收藏」1.springbootresponsebody返回值中null值处理@postmapping(path=”/test”,produces=mediatype.application_json_value)publicobjecttest(){jsonobjectjsonobject=newjsonobject();jsonobject.put(“test”,”tes…

    2022年5月28日
    39
  • 《我的极品媳妇》方志强 王亚欣 小说读后感

    《我的极品媳妇》方志强 王亚欣 小说读后感男主角方志强博爱和善良的性格及对待生活的刚毅和坚韧让人敬佩,无论是对待自己的背叛过的兄弟还是互殴的光头都是义字当头,对无耻小人以及伤害身边家人的败类绝不手软,如此种种人格魅力的塑造相当完美;但唯一的缺点是对感情的优柔寡断。在本书中始终在反复得而复失幸福的痛苦中挣扎,但这些也是方志强感情方面性格缺陷导致的。女主王亚欣温柔、贤惠、成熟、多金、坚强、最主要的出身平凡,和男主方志强起步阶段是同一类型的。…

    2022年6月4日
    60
  • gmapping matlab实现_gmapping学习

    gmapping matlab实现_gmapping学习一、机器人地图机器人地图一般分为三种类型:栅格地图,拓扑地图,特征地图1、栅格地图栅格地图栅格地图,在物流信息技术中有所涉猎,其就是构建一个个“小方块”,利用颜色信息来区分的地图的位置信息。在机器人建图中,栅格地图容易构建,表示且保存位置的唯一,对于短路径的规划方便;但栅格地图的路径规划效率不高,空间浪费(栅格的分辨率不依赖于环境的复杂度)并且也需要精确的机器人位置估计,其对于物体识别的人机交互问…

    2022年6月16日
    36
  • WIN10系统 Indirect Display 虚拟显示器之特殊应用

    WIN10系统 Indirect Display 虚拟显示器之特殊应用byfanxiushu2020-05-20转载或引用请注明原始作者。有人询问我是否可以实现这样一种功能:对windows输出的每一帧图像数据显示做一些特殊处理(比如球形桌面,曲面化等特效),然后再显示到显示器上。而且还不止一个人这样咨询过,虽然我不大清楚这种需求具体用在何处,估计也是一些特殊场所。这种需求,最先想到的,也最直观的想法就是能否给显卡驱动添加一个过滤驱动,然后拦截图像数据,然后再做些特殊处理。可惜想法是美好的,却是难以实现的,甚至是不大可能实现的。首先windows中就没显卡过

    2022年8月21日
    7
  • c语言平方根求和用sqrt函数,sqrt函数 Excel怎么使用平方根函数SQRT

    c语言平方根求和用sqrt函数,sqrt函数 Excel怎么使用平方根函数SQRT在统计数据的时候,我们可能会要对着一个数据进行开平方,那么在Excel当中sqrt函数就非常重要了,可是这个函数究竟要怎么使用呢?今天我们就一起来了解一下吧。sqrt函数——Excel怎么使用平方根函数SQRT第一步,桌面上打开一个Excel文档第二步,文档打开的主界面第三步,平方根函数SQRT只有1个参数,number第四步,我们举例,来更好地说明,第五步,输入完整的SQRT函数第六步,回车后,…

    2022年6月10日
    32
  • t276芯片(芯片st是什么意思)

    ST7789V2是一个单芯片TFT-LCD驱动器。该芯片可以直接连接到外部MCU,支持并行8080系列的8位/9位/16位/18位接口,也支持SPI串行通讯接口。显示数据可以存储在240x320x18bits的片上显示数据RAM中。它可以在没有外部操作时钟的情况下执行显示数据RAM读写操作,以尽量减少功耗。并行接口占用外部MCU芯片引脚较多,但其通讯速率较快,一般只在需要高速刷新及MCU资源比较丰富的场合使用。SPI串行通讯接口占用MCU芯片引脚较少,通讯速率相对并行接口较慢,但因其占用MCU引脚.

    2022年4月9日
    160

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号