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