mysql - 为什么我的 Spring Batch 任务使用相同的 JOB_INSTANCE_ID 启动多个作业执行?

标签 mysql spring spring-batch cloud-foundry spring-cloud-dataflow

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

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

enter image description here

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

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

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

最佳答案

下面一行清楚地说明了一切。

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

关于mysql - 为什么我的 Spring Batch 任务使用相同的 JOB_INSTANCE_ID 启动多个作业执行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59417982/

相关文章:

php - 如何在php中停止数据自动插入数据库

java - 当提供以 HTML 作为值的 JSON 输入时,REST API 返回 400(错误请求)

java - Spring Boot 2 拦截器对每个请求解析 `/login'

java - 验证异常 : Unable to find a default provider

spring-boot - 使用 spring-boot 连接到 spring-batch 和应用程序数据库

Mysql插入2个表

php - MySQL 递归查询不适用于 MariaDB

java - 如何使用Spring-Batch批量插入?

带有 Spring 数据的 Spring 批处理

mysql - SQL 语法错误。存储过程的创建