web-dev-qa-db-fra.com

Comment Spring Boot exécute des travaux par lots

J'ai suivi cet exemple pour Spring Batch with Boot.

Lorsque vous exécutez la méthode principale, le travail est exécuté. De cette façon, je ne vois pas comment on peut contrôler l'exécution du travail. Par exemple, vous planifiez un travail, obtenez un accès à l'exécution du travail ou définissez des paramètres de travail. 

J'ai essayé d'enregistrer mon propre JobLauncher

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

mais quand j'essaye de l'utiliser dans la méthode principale:

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

Le travail est à nouveau exécuté lorsque le contexte est chargé et j'ai JobInstanceAlreadyCompleteException lorsque j'essaie de l'exécuter manuellement. Existe-t-il un moyen d'empêcher l'exécution automatique du travail?

39
Evgeni Dimitrov

L’exécution des travaux peut être empêchée en définissant

spring.batch.job.enabled=false

dans application.properties. Vous pouvez également utiliser spring.batch.job.names. Une liste délimitée par des virgules des noms de travaux à exécuter.

Tiré d'ici: comment arrêter la première exécution des travaux planifiés par lots du printemps lors de l'exécution du code?

52
Evgeni Dimitrov

Vous pouvez activer l'exécution d'un Job à l'aide du POST du contrôleur de repos:

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

}
0
dmotta