我正在使用Spring-Boot开发一个Spring-Batch项目,一切进展顺利。我已经完成了一些spring- batch的示例(包括来自spring.io的示例),但是我不确定其中的某些内容是什么,并且“它只是有效”并不能满足我的要求。
我的Spring靴子主类实现了CommandLineRunner,对于这个特殊的工作,初始设置看起来像
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抽象使我很难知道这里发生了什么
RunIdIncrementer
这不是“启动”,而是“批处理”。Spring Batch的规则是a JobInstance只能运行一次才能完成。这意味着对于标识作业参数的每种组合,只能有一个JobExecution结果为COMPLETE。A RunIdIncrementer会将附加的唯一参数附加到参数列表中,以便得到的组合将是唯一的…… JobInstance每次使用相同的识别参数组合运行作业时,都会给您一个新的信息。
JobInstance
JobExecution
COMPLETE
该RunIdIncrementer是真正的只是一个特例JobParametersIncrementer,您可以在我们的文档在这里阅读更多关于:http://docs.spring.io/spring- batch/trunk/reference/htmlsingle/#JobParametersIncrementer
JobParametersIncrementer