Java SpringBatch CommandLineJobRunner-下一步使用旧run.id

Java SpringBatch CommandLineJobRunner-下一步使用旧run.id,java,spring,spring-batch,Java,Spring,Spring Batch,我们使用CommandLineJobRunner执行Spring批处理作业。我们正在命令行中使用-next: java -Dlog4j.configuration=file:./prop/log4j.properties -Dlogfile=logfile_load_data -jar EtlLoadData.jar loaddata_etl_config.xml loaddata_etl_job -next 我们开始遇到一个错误: Job Terminated in error: A job

我们使用CommandLineJobRunner执行Spring批处理作业。我们正在命令行中使用-next:

java -Dlog4j.configuration=file:./prop/log4j.properties -Dlogfile=logfile_load_data -jar EtlLoadData.jar loaddata_etl_config.xml loaddata_etl_job -next
我们开始遇到一个错误:

Job Terminated in error: A job instance already exists and is complete for parameters={run.id=10}.  If you want to run this job again, change the parameters. 

org.springframework.batch.core.repository.JobInstanceAlreadyCompleteException: A job instance already exists and is complete for parameters={run.id=10}.  If you want to run this job again, change the parameters.
    at  org.springframework.batch.core.repository.support.SimpleJobRepository.createJobExecution(SimpleJobRepository.java:122)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:309)
at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:183)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:110)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
at org.springframework.batch.core.repository.support.AbstractJobRepositoryFactoryBean$1.invoke(AbstractJobRepositoryFactoryBean.java:168)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202)
at $Proxy14.createJobExecution(Unknown Source)
at org.springframework.batch.core.launch.support.SimpleJobLauncher.run(SimpleJobLauncher.java:111)
at org.springframework.batch.core.launch.support.CommandLineJobRunner.start(CommandLineJobRunner.java:349)
at org.springframework.batch.core.launch.support.CommandLineJobRunner.main(CommandLineJobRunner.java:574)
我认为如果您使用
-next
选项运行,这应该不是问题。有什么想法吗


作为临时解决办法,我清理了数据库中的SpringBatch表,但我不希望这种情况再次发生。

不知道-next选项


最快的方法是将当前时间戳作为参数传递给作业。这样它将是独一无二的,不会真正干扰你的工作。

不知道下一个选项


最快的方法是将当前时间戳作为参数传递给作业。这样,它将是唯一的,不会真正干扰您的工作。

使用de-next选项,您应该在增量实现中设置JobParameters

在这个例子中,我使用->new RunIdIncrementer来避免这样的消息:一个作业实例已经存在,并且参数已经完成

@Autowired
private JobBuilderFactory jobs;
...
@Bean(name=JOB_NAME)
public Job job() {        

    return jobs.get(JOB_NAME)
               .start(this.login())
               .next(this.launchDuke())
               .incrementer(new RunIdIncrementer())
               .build();
}

使用de-next选项,您应该设置JobParametersIncrementer实现

在这个例子中,我使用->new RunIdIncrementer来避免这样的消息:一个作业实例已经存在,并且参数已经完成

@Autowired
private JobBuilderFactory jobs;
...
@Bean(name=JOB_NAME)
public Job job() {        

    return jobs.get(JOB_NAME)
               .start(this.login())
               .next(this.launchDuke())
               .incrementer(new RunIdIncrementer())
               .build();
}

谢谢你的提示。我不确定这是怎么回事。这只是您添加到命令行中的内容吗?您可以通过在命令行中添加的内容了解
-next
选项。对的您可以像通常传递的其他JobParameter一样传递它。要使用-next命令,需要配置JobParameterIncrementer。RunIdCrementer是开箱即用的。RunIdCreditometer还允许您设置密钥的名称。我读了一些关于保留现有参数可能存在问题的文章…所以要小心…否则就写你自己的。我为一个增量器创建了一个新类,它复制了RunIdIncrementer,但也添加了当前日期/时间。这解决了问题。谢谢你的提示。我不确定这是怎么回事。这只是您添加到命令行中的内容吗?您可以通过在命令行中添加的内容了解
-next
选项。对的您可以像通常传递的其他JobParameter一样传递它。要使用-next命令,需要配置JobParameterIncrementer。RunIdCrementer是开箱即用的。RunIdCreditometer还允许您设置密钥的名称。我读了一些关于保留现有参数可能存在问题的文章…所以要小心…否则就写你自己的。我为一个增量器创建了一个新类,它复制了RunIdIncrementer,但也添加了当前日期/时间。这就解决了问题。