为什么我的Spring批处理任务使用相同的JOB_INSTANCE_ID为多个作业执行启动?

liwlm1x9  于 2022-11-21  发布在  Spring
关注(0)|答案(4)|浏览(224)

我在云平台上运行了一个Spring批处理任务,它将使用提供的命令行参数启动,然后跳过第一步的执行,并出现以下错误:

[OUT] The job execution id 992 was run within the task execution 1325
[OUT] Step already complete or not restartable, so no action to execute: 
StepExecution: id=1071, version=3, name=OFileStep, status=COMPLETED, exitStatus=COMPLETED, readCount=0, filterCount=0, writeCount=0 readSkipCount=0, 
writeSkipCount=0, processSkipCount=0, commitCount=1, rollbackCount=0, exitDescription=

我已经调查了Spring Batch使用的MySQL示例中的元数据表,发现JOB_INSTANCE_ID在多次执行之间是相同的,而它每次都应该递增1。

我为作业配置定义的@Bean是:

@Bean
public Job job() {
    return jobBuilderFactory.get(OTaskConstants.JOB_NAME)
            .listener(listener())
            .incrementer(new RunIdIncrementer())
            .start(dataTransferTaskStep())
            .next(controlMTaskStep())
            .build();
}

有人知道是什么导致了这种行为吗?

s5a0g9ez

s5a0g9ez1#

下面这条线清楚地说明了一切。

Step already complete or not restartable, so no action to execute:

这意味着步骤/作业已经完成,无法重新启动。这是Spring Batch的行为。为了绕过此问题,我们需要传递一个唯一的参数。
在你的情况下,我看到你已经有RunIdIncrementer。现在的问题是为什么它不工作。
您是否可以查看BATCH_JOB_PARMS表以了解哪些参数传递给了作业?您可能遗漏了某些内容。
您也可以使用SimpleIncrementor。请参阅下面的代码以了解说明。
https://docs.spring.io/spring-batch/docs/current/reference/html/index-single.html#JobParametersIncrementer

vmjh9lq9

vmjh9lq92#

删除作业上的@Bean注解。
它会导致在每次启动/启动应用程序时,在没有参数的情况下启动作业,因为spring会尝试加载bean,然后启动批处理作业。
删除注解并使用spring scheduler来调度作业。

kknvjkwl

kknvjkwl3#

我遇到了同样的问题。下面的代码帮助我解决了这个问题。通过在作业启动器中添加参数,每次运行都会创建一个新的job_instance_id

@SpringBootApplication
public class App implements CommandLineRunner {
    @Autowired
    JobLauncher jobLauncher;

    @Autowired
    Job job;

    public static void main(String[] args) {
        SpringApplication.run(App.class, args);
    }

    @Override
    public void run(String... args) throws Exception {
        JobParameters params = new JobParametersBuilder()
                .addString("JobID", String.valueOf(System.currentTimeMillis()))
                .toJobParameters();
        jobLauncher.run(job, params);
    }
}
djp7away

djp7away4#

  • 解决方案 *

请参阅上面的错误消息“如果要再次运行此作业,请更改参数。”公式为JobInstance = JobParameters + Job。如果没有任何JobParameters参数,只需将当前时间作为参数传递以创建新的JobInstance。例如,

CustomJobLauncher.java

//...

@Component
public class CustomJobLauncher {

    @Autowired
    JobLauncher jobLauncher;

    @Autowired
    Job job;

    public void run() {

      try {
        JobParameters jobParameters = 
          new JobParametersBuilder()
          .addLong("time",System.currentTimeMillis()).toJobParameters();
            
        JobExecution execution = jobLauncher.run(job, jobParameters);
        System.out.println("Exit Status : " + execution.getStatus());
            
      } catch (Exception e) {
        e.printStackTrace();
      }

    }

}

来源:https://mkyong.com/spring-batch/spring-batch-a-job-instance-already-exists-and-is-complete-for-parameters/

相关问题