spring批处理:使用相同的参数重新启动已完成的作业

时间:2012-02-01 13:55:04

标签: spring-batch

是否可以在具有相同作业参数的春季批次中重新启动作业,该作业已成功完成?

假设我有一个步骤,从一个文件读取并写入另一个文件。

出于测试目的,我需要一次又一次地运行这项工作。但是,我不希望工作参数(这是我今天从表中读到的日期)一次又一次地改变。

这种情况可能吗?

5 个答案:

答案 0 :(得分:4)

Long startNextInstance(String jobName) 
      throws NoSuchJobException, JobParametersNotFoundException, JobRestartException, 
             JobExecutionAlreadyRunningException, JobInstanceAlreadyCompleteException;

JobOperator类的此方法以及JobParameterIncrementer可用于重新启动作业,无论是失败还是已完成。

http://static.springsource.org/spring-batch/apidocs/org/springframework/batch/core/launch/support/SimpleJobOperator.html#startNextInstance(java.lang.String

答案 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();
    } }

您可以查看a simple sample using it

答案 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>

此处是屏幕截图

enter image description here