jobbuilderfactory job example enablebatchprocessing desde cero batch java spring spring-batch spring-boot

java - example - spring batch jobbuilderfactory



Cómo Spring Boot ejecuta trabajos por lotes (2)

La ejecución de trabajos se puede evitar configurando

spring.batch.job.enabled=false

en application.properties. O puede usar spring.batch.job.names , necesita una lista delimitada por comas de los nombres de trabajos que se ejecutarán.

Tomado desde aquí: ¿cómo detener la ejecución de trabajos programados por lotes de primavera al momento de ejecutar el código?

Seguí esta muestra para Spring Batch with Boot.

Cuando ejecuta el método principal, el trabajo se ejecuta. De esta forma no puedo entender cómo se puede controlar la ejecución del trabajo. Por ejemplo, cómo programar un trabajo, u obtener acceso a la ejecución del trabajo, o establecer los parámetros del trabajo.

Traté de registrar mi propio JobLauncher

@Bean public JobLauncher jobLauncher(JobRepository jobRepo){ SimpleJobLauncher simpleJobLauncher = new SimpleJobLauncher(); simpleJobLauncher.setJobRepository(jobRepo); return simpleJobLauncher; }

pero cuando intento usarlo en el método principal:

public static void main(String[] args) { ConfigurableApplicationContext ctx = SpringApplication.run(Application.class, args); JobLauncher jobLauncher = ctx.getBean(JobLauncher.class); //try catch removed for readability jobLauncher.run(ctx.getBean(Job.class), new JobParameters()); }

El trabajo se ejecuta nuevamente cuando se carga el contexto y recibí JobInstanceAlreadyCompleteException cuando intento ejecutarlo manualmente. ¿Hay alguna manera de evitar la ejecución automática del trabajo?


Puede habilitar la ejecución de un trabajo usando POST del controlador de reposo:

@RestController @RequestMapping(value="/job/") public class JobLauncherController { private static final Log LOG = LogFactory.getLog(JobLauncherController.class); @Autowired private JobLauncher jobLauncher; @Autowired private Job job; @Autowired private JobRepository jobRepository; @Autowired private JobRegistry jobRegistry; @RequestMapping("/launchjob/{jobName}") public String handle(@PathVariable("jobName") String jobName, @RequestBody Map<String,Object> request) throws Exception { try { request.put("timeJobStarted", DateUtil.getDateFormatted(new Date(), DateUtil.DATE_UUUUMMDDHHMMSS)); Map<String,Object> mapMessage = this.enrichJobMessage(request); Map<String, JobParameter> jobParameters = new HashMap<>(); mapMessage.forEach((k,v)->{ MapperUtil.castParameter(jobParameters, k, v); }); jobParameters.put(Field.Batch.JOB_INSTANCE_NAME, new JobParameter(jobName)); jobLauncher.run(job, new JobParameters(jobParameters)); assertNotNull(jobRegistry.getJob(job.getName())); }catch( NoSuchJobException ex){ jobRegistry.register(new ReferenceJobFactory(job)); } catch (Exception e) { LOG.error(e.getMessage(),e); } return "Done"; } public static void castParameter(Map<String, JobParameter> jobParameters, String k, Object v){ if(v instanceof String){ jobParameters.put(k, new JobParameter((String)v)); }else if(v instanceof Date){ jobParameters.put(k, new JobParameter((Date)v)); }else if(v instanceof Double){ jobParameters.put(k, new JobParameter((Double)v)); }else if(v instanceof Long){ jobParameters.put(k, new JobParameter((Long)v)); }else{ DslJson dslJson = new DslJson<>(); JsonWriter writer = dslJson.newWriter(); try { dslJson.serialize(writer,v); jobParameters.put(k, new JobParameter(writer.toString())); } catch (IOException e) { LOG.warn(e.getMessage(), e); } } } }