一尘不染

JobBuilderFactory.get(job).incrementer(RunIdIncrementer)的功能是什么?

spring-boot

我正在使用Spring-Boot开发一个Spring-Batch项目,一切进展顺利。我已经完成了一些spring-
batch的示例(包括来自spring.io的示例),但是我不确定其中的某些内容是什么,并且“它只是有效”并不能满足我的要求。

我的Spring靴子主类实现了CommandLineRunner,对于这个特殊的工作,初始设置看起来像

@Bean
public Job myJob(JobExecutionListenerSupport listener) {
    return myJobBuilderFactory.get(JOB)
            .listener(listener)
            .start(myStep())
            .build();
}

造成的

java.lang.IllegalStateException: Failed to execute CommandLineRunner
    at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:809) ~[spring-boot-1.3.2.RELEASE.jar:1.3.2.RELEASE]
    at org.springframework.boot.SpringApplication.callRunners(SpringApplication.java:790) ~[spring-boot-1.3.2.RELEASE.jar:1.3.2.RELEASE]
    at org.springframework.boot.SpringApplication.afterRefresh(SpringApplication.java:777) [spring-boot-1.3.2.RELEASE.jar:1.3.2.RELEASE]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:308) [spring-boot-1.3.2.RELEASE.jar:1.3.2.RELEASE]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1191) [spring-boot-1.3.2.RELEASE.jar:1.3.2.RELEASE]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1180) [spring-boot-1.3.2.RELEASE.jar:1.3.2.RELEASE]
    at org.bjc.providermodel.maintenance.MaintenanceApplication.main(MaintenanceApplication.java:20) [classes/:?]
Caused by: org.springframework.batch.core.repository.JobExecutionAlreadyRunningException: A job execution for this job is already running: JobInstance: id=99, version=0, Job=[myJob]

为什么将上述bean更改为

@Bean
public Job myJob(JobExecutionListenerSupport listener) {
    return myJobBuilderFactory.get(JOB)
            .incrementer(new RunIdIncrementer())
            .listener(listener)
            .start(myStep())
            .build();
}

使一切顺利吗?我试图阅读有关该文档的内容,RunIdIncrementer在此处进行了一些阅读。据我所知,它需要这个增量器来跟踪正在运行的一些特定工作,这些工作正在执行“工作”,但不确定确切的工作是什么。Spring-
Boot抽象使我很难知道这里发生了什么


阅读 1145

收藏
2020-05-30

共1个答案

一尘不染

这不是“启动”,而是“批处理”。Spring Batch的规则是a
JobInstance只能运行一次才能完成。这意味着对于标识作业参数的每种组合,只能有一个JobExecution结果为COMPLETE。A
RunIdIncrementer会将附加的唯一参数附加到参数列表中,以便得到的组合将是唯一的……
JobInstance每次使用相同的识别参数组合运行作业时,都会给您一个新的信息。

RunIdIncrementer是真正的只是一个特例JobParametersIncrementer,您可以在我们的文档在这里阅读更多关于:http://docs.spring.io/spring-
batch/trunk/reference/htmlsingle/#JobParametersIncrementer

2020-05-30