весенний пакет: перезапуск завершенного задания с теми же параметрами

Можно ли перезапустить задание в весеннем пакете с теми же параметрами задания, которое успешно завершено?

Скажем, у меня есть задание с шагом, который читает из одного файла и записывает в другой.

Для целей тестирования мне нужно запускать задание снова и снова. Однако я не хочу, чтобы параметр задания (это сегодняшняя дата, которую я читаю из таблицы) менялся снова и снова.

Возможен ли такой сценарий?


person Vicky    schedule 01.02.2012    source источник


Ответы (5)


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)

person user1201659    schedule 10.02.2012
comment
Я до сих пор не могу понять, почему часть логики находится в JobOperator, а часть в JobLauncher. Как по мне, эти два должны быть объединены. Наконец, я создал семантически эквивалентный код startNextInstance() в мой проект . - person dma_k; 07.04.2012
comment
@dma_k - я полностью разделяю ваше недовольство тем, как API распределены по нескольким классам. Я действительно не могу понять, как эти API-интерфейсы когда-либо выходили без очень веской причины для этого. - person Matthew Cachia; 29.06.2016
comment
@MatthewCachia docs.spring.io/ spring-batch/trunk/reference/html/ Citing: Accenture предоставила ранее проприетарные структуры архитектуры пакетной обработки, основанные на многолетнем опыте создания пакетных архитектур с несколькими последними поколениями платформ. , (т. е. COBOL/мейнфрейм, C++/Unix, а теперь и Java/где угодно) в проект Spring Batch вместе с ресурсами коммиттера для обеспечения поддержки, усовершенствований и будущей дорожной карты. - person froh42; 02.02.2018
comment
@dma_k Интерфейс JobOperator является требованием JSR-352. Мы все знаем, что пакет Spring предшествует JSR, и многие функциональные совпадения неизбежны. - person codemonkey; 23.02.2018

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);
person Jijo    schedule 30.12.2013

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

Вы можете проверить простой образец, используя его

person Serkan Arıkuşu    schedule 01.02.2012
comment
Spring Batch требует уникальных параметров задания для его выполнения => это требование не имеет для меня никакого смысла - person Agustí Sánchez; 15.10.2013

у меня есть эта функция

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 в базе данных требуемой работы. Если это так, задание должно быть запущено с параметрами, полученными с помощью job.getJobParametersIncrementer().getNext(jobParameters). Это все.

person EliuX    schedule 01.10.2015

Я следовал той же идее, что и Серкан Арикушу.

Мой пакет можно перезапускать с теми же параметрами, добавляя внутри каждый раз уникальный параметр (отметка времени).

Я делаю это, создавая файл 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>

Вот скриншот

введите здесь описание изображения

person vvauban    schedule 11.09.2019