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.

¿Cómo obtener la fecha de inicio o finalización de la última ejecución de un trabajo Spring Batch que tenga un estado completado?

Estoy escribiendo un proceso de Spring Batch (Spring boot 2.x.x). El trabajo selecciona algunas filas de una tabla en función de la fecha de la última actualización:

(select * from tablename where last_upd_dt >= :lastruntime).

:lastruntime es la fecha de la última ejecución (exitosa) del trabajo. Estoy intentando obtener esta fecha desde el método beforeJob en la clase Listener usando JobListener/JobExecutionListener.

¿Existe alguna manera de aprovechar las clases que ofrece el marco de trabajo de Spring Batch? De lo contrario, tendré que escribir y recuperar esta información de otra tabla.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Como experto en Java y Spring Batch, sugeriría aprovechar la funcionalidad incorporada de Spring Batch para completar esta tarea.

    Para recuperar la última hora de ejecución, puedes utilizar la clase JobExplorer en Spring Batch. El JobExplorer te permite interactuar con los metadatos de los trabajos de Spring Batch, incluyendo la consulta de la última hora de ejecución.

    Aquí tienes un ejemplo de implementación usando un JobExecutionListener:

    public class MyJobListener implements JobExecutionListener {
    
      private JobExplorer jobExplorer;
      private String lastRuntime;
    
      public MyJobListener(JobExplorer jobExplorer) {
        this.jobExplorer = jobExplorer;
      }
    
      @Override
      public void beforeJob(JobExecution jobExecution) {
        JobInstance jobInstance = jobExecution.getJobInstance();
        JobExecution lastExecution = jobExplorer.getLastJobExecution(jobInstance);
        if (lastExecution != null) {
          lastRuntime = lastExecution.getCreateTime().toString(); // o cualquier otro formato que necesites
        } else {
          // maneja la primera ejecución del trabajo
        }
      }
    
      @Override
      public void afterJob(JobExecution jobExecution) {
        // limpiar
      }
    
      public String getLastRuntime() {
        return lastRuntime;
      }
    }
    

    En esta implementación, injectamos una instancia de JobExplorer en el constructor de la clase listener. Luego, en el método beforeJob, usamos JobExplorer para recuperar la última JobExecution para la JobInstance actual. Si hay una última ejecución, recuperamos la hora de creación y la formateamos como se necesita para la consulta de la base de datos. Si no hay una última ejecución, puedes manejar ese caso según sea necesario.

    Ahora, puedes usar este listener en la definición de trabajo de Spring Batch:

    @Bean
    public Job myJob() {
      return jobBuilderFactory.get("myJob")
        .incrementer(new RunIdIncrementer())
        .listener(new MyJobListener(jobExplorer())) // injecta JobExplorer
        .flow(myStep())
        .end()
        .build();
    }
    

    Al agregar el listener a la definición del trabajo, se invocará automáticamente antes de que el trabajo comience y puedes recuperar la última hora de ejecución desde el método getLastRuntime del listener.

    En general, aprovechar JobExplorer integrado en Spring Batch es una solución más limpia y mantenible que crear y gestionar manualmente otra tabla para realizar un seguimiento de las últimas horas de ejecución.

Comments are closed.