es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Spring Batch ejecuta pasos varias veces en una programación determinada.

He configurado un programa de planificación para invocar mi trabajo en un intervalo específico (para fines de prueba, probé con intervalos de 30 segundos). Está invocando exitosamente el trabajo sin problemas. Pero una vez que la ejecución del trabajo es exitosa durante la primera ejecución, no vuelve a ejecutar el paso nuevamente (aunque he pasado un nuevo parámetro de trabajo en cada invocación). Quiero ejecutar el mismo paso aunque se haya completado ya que podría haber nuevos datos en la fuente de la base de datos. He intentado

.allowStartIfComplete(true)

Pero no invocó el lector en el paso.

El requisito principal es volver a ejecutar los mismos pasos de trabajo por completo, ya sea que se haya completado exitosamente o no.


// Ejecuta el trabajo
@Bean
public Job jobUpdate(JobCompletionNotificationListener listener, Step step1) {
return this.jobBuilderFactory.get(“employee”)
.listener(listener)
.incrementer(new RunIdIncrementer())
.start(step1)
.build();
}

@Bean
public Step step1() {
return stepBuilderFactory.get(“step1”)
.allowStartIfComplete(true)
.<employee, employee=””>chunk(2)
.reader(reader())
.processor(processor())
.faultTolerant().skipPolicy(httpClientExceptionSkipper())
.writer(compositeItemWriter())
.build();
}

Después de la ejecución inicial, lo siguiente es del registro de la consola.

Realmente agradecería si alguien pudiera arrojar algo de luz sobre esto.</employee,>

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Parece que la configuración actual no permite que el paso vuelva a ser ejecutado una vez que ha finalizado correctamente, aunque haya nuevos datos disponibles en la base de datos fuente.

    Para resolver este problema, puedes intentar eliminar el .allowStartIfComplete(true) en el método step1(). Esta configuración básicamente le indica al paso que no se ejecute nuevamente si ha finalizado con éxito.

    Después de eliminar esta configuración, el paso debería ejecutarse cada vez que se ejecute el trabajo, independientemente de si ha finalizado correctamente o no. El lector en el paso también debería ser invocado cada vez.

    Aquí está el método step1() actualizado sin la configuración .allowStartIfComplete(true):

    @Bean
    public Step step1() {
      return stepBuilderFactory.get("step1")
        .<employee, employee="">chunk(2)
        .reader(reader())
        .processor(processor())
        .faultTolerant().skipPolicy(httpClientExceptionSkipper())
        .writer(compositeItemWriter())
        .build();
    }
    

    Además, puedes considerar establecer un parámetro de trabajo diferente o modificar el existente cada vez que se ejecute el trabajo, para que Spring Batch sepa que es un trabajo nuevo y no simplemente una reejecución del mismo trabajo.

    Por ejemplo, puedes agregar un parámetro de marca de tiempo a los parámetros del trabajo:

    JobParameters parameters = new JobParametersBuilder()
      .addLong("timestamp", System.currentTimeMillis())
      .toJobParameters();
    

    Esto asegura que el trabajo sea tratado como un trabajo nuevo cada vez que se ejecute, incluso si los parámetros son de otra manera los mismos.</employee,>

Comments are closed.