是否可以在具有相同作业参数的春季批次中重新启动作业,该作业已成功完成?
假设我有一个步骤,从一个文件读取并写入另一个文件。
出于测试目的,我需要一次又一次地运行这项工作。但是,我不希望工作参数(这是我今天从表中读到的日期)一次又一次地改变。
这种情况可能吗?
答案 0 :(得分:4)
Long startNextInstance(String jobName)
throws NoSuchJobException, JobParametersNotFoundException, JobRestartException,
JobExecutionAlreadyRunningException, JobInstanceAlreadyCompleteException;
JobOperator类的此方法以及JobParameterIncrementer可用于重新启动作业,无论是失败还是已完成。
答案 1 :(得分:4)
Spring Batch需要唯一的作业参数才能执行。因此您可以将当前时间添加为作业参数
Map<String, JobParameter> confMap = new HashMap<String, JobParameter>();
confMap.put("time", new JobParameter(System.currentTimeMillis()));
JobParameters jobParameters = new JobParameters(confMap);
jobLauncher.run(springCoreJob, jobParameters);
答案 2 :(得分:3)
Spring Batch需要唯一的作业参数才能执行。 在您的情况下,如果要使用相同的日期参数运行相同的作业,则应“添加”另一个作业参数以使其唯一。你可能会想到它独特的工作参数集。
在这种情况下可以使用 org.springframework.batch.core.JobParametersIncrementer
接口,只需将它赋予JobParameter,它就会添加一个run.id,使其独一无二。
public class SampleIncrementer implements JobParametersIncrementer {
public JobParameters getNext(JobParameters parameters) {
if (parameters==null || parameters.isEmpty()) {
return new JobParametersBuilder().addLong("run.id", 1L).toJobParameters();
}
long id = parameters.getLong("run.id",1L) + 1;
return new JobParametersBuilder().addLong("run.id", id).toJobParameters();
} }
答案 3 :(得分:0)
我有这个功能
f9490c5
关键是首先检查所需作业的数据库中是否存在public void run()
{
LOG.info("Processing batch...");
try
{
Job job = createNewJob();
JobParameters jobParameters = new JobParameters();
Optional<JobInstance> existingInstance = jobExplorer.getJobInstances(job.getName(), 0, 1).stream().findFirst();
if (existingInstance.isPresent())
{
jobParameters = job.getJobParametersIncrementer().getNext(jobParameters);
LOG.warn("Trying to restart task \"{}\" with the parameters [{}]", job, jobParameters);
}
jobLauncher.run(job, jobParameters);
}
catch (JobExecutionAlreadyRunningException ex)
{
LOG.warn("The task \"{}\" is already running", BillingBatchConfig.QUALIFIER);
}
catch (JobRestartException ex)
{
LOG.warn("The task \"{}\" cannot be restarted", BillingBatchConfig.QUALIFIER);
}
catch (JobInstanceAlreadyCompleteException ex)
{
LOG.warn("The task \"{}\" cannot be restarted cause its finished", BillingBatchConfig.QUALIFIER);
}
catch (JobParametersInvalidException ex)
{
LOG.warn("The task \"{}\" cannot be excecuted cause the parameters are invalid", BillingBatchConfig.QUALIFIER);
}
catch (Exception ex)
{
LOG.warn("Unexpected error running the task \"{}\"", BillingBatchConfig.QUALIFIER);
}
}
的现有实例。如果是这样,则必须使用org.springframework.batch.core.explore.JobExplorer
获得的参数启动作业。多数民众赞成。
答案 4 :(得分:0)
我遵循与SerkanArıkuşu相同的想法。
每次唯一参数(时间戳记),通过在内部添加 ,我的批处理可以使用相同的参数重新启动。 >)
我通过创建一个JobParametersIncrementer
来做到这一点。
增量器:
package com.batch;
import java.util.Date;
import org.springframework.batch.core.JobParameters;
import org.springframework.batch.core.JobParametersBuilder;
import org.springframework.batch.core.JobParametersIncrementer;
public class MyIncrementer implements JobParametersIncrementer {
public JobParameters getNext(JobParameters parameters) {
long id = new Date().getTime();
JobParameters jParam = new JobParametersBuilder()
.addLong("run.id", id).toJobParameters();
return jParam;
}
}
作业XML中的其他内容:
<bean id="myIncrementer" class="com.batch.MyIncrementer"/>
<job id="myJob" ... restartable="true" incrementer="myIncrementer">
<step ... >
<tasklet ...>
<chunk ... />
...
</tasklet>
</step>
<batch:listeners>
...
</batch:listeners>
</job>