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.

Problema con el tiempo entre la ejecución de procesadores en Spring Batch.

Estoy intentando ejecutar un Spring Batch y tengo un problema en la etapa del procesador.

Tengo alrededor de 100,000 registros para procesar y hago mi consulta y la envío al procesador.

El problema surge aquí, no sé por qué, pero Spring Batch tarda 80 segundos entre las ejecuciones del chunk y no puedo ver dónde está el problema.

  @Bean
  public Job MiBatch(
      @Qualifier("pasoUno") Step pasoUno) {

<pre><code>return jobBuilderFactory
    .get("MiBatch")
    .incrementer(new RunIdIncrementer())
    .start(pasoUno)
    .next(xxx)
    .next(xxx)
    .next(xxx)
    .build();
</code></pre>

}

@Bean
public Step pasoUno() throws Exception {
    return stepBuilderFactory
        .get("pasoCrearPerfilCliente")
        .<Map<String, Object>, MiObjetoSalida>chunk(500)
        .reader(repositoryUserItemReader())
        .processor(miProcesador)
        .writer(escribirMiObjeto())
        .faultTolerant()
        .skip(Exception.class)
        .skipLimit(250)
        .build();
  }
  este es mi procesador

myService.accept(mapper.convertValue(userData, ProfileData.class));
//(Esta parte llama a una API externa, ese no es el problema)
final var myObject =
    new MyObject((Integer) user.get("user_id"), (String) userData.get("xxxxx"));
return myObject;

My writer es solo una persistencia en el repositorio

  private ItemWriter<MyObject> writer() {
    RepositoryItemWriter<MyObject> itemWriter = new RepositoryItemWriter<>();
    itemWriter.setRepository(myRepository);
    itemWriter.setMethodName("save");
    return itemWriter;
  }

Esta es parte de mi código y la imagen del registro
enter image description here

Si alguien puede ayudarme… ¡Gracias!

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Parece que el problema está en el tiempo de ejecución del fragmento, que tarda alrededor de 80 segundos para 500 registros. Una posible razón para esto podría ser la llamada a la API externa en el paso del procesador, que tarda mucho tiempo en responder.

    Una solución podría ser optimizar la llamada a la API analizando el tiempo de respuesta y mejorando su rendimiento. Además, podrías considerar dividir el trabajo en varios pasos con tamaños de fragmentos más pequeños para reducir el tiempo de procesamiento por fragmento.

    Otra opción es utilizar una herramienta de monitoreo de rendimiento como VisualVM o JProfiler para identificar el cuello de botella en el proceso y optimizarlo. También podrías habilitar el registro de depuración para rastrear la ejecución e identificar el paso exacto donde se produce el retraso.

    En general, se necesita más información sobre la llamada a la API externa y la lógica del procesador para proporcionar una solución más específica.

Comments are closed.