Comment lancer les travaux par lots

j'ai suivi cet échantillon pour le Lot de ressorts avec botte.

lorsque vous exécutez la méthode principale, le travail est exécuté. Comme ça, Je ne vois pas comment on peut contrôler l'exécution du travail. Par exemple, comment programmer une tâche, ou accéder à l'exécution de la tâche, ou définir les paramètres de la tâche.

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'essaie de l'utiliser dans la méthode main:

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 de nouveau exécutée lorsque le contexte est chargé et j'ai eu JobInstanceAlreadyCompleteException quand j'essaie de le lancer manuellement. Est-il possible d'empêcher l'emploi automatique de l'exécution?

37
demandé sur Allan Pereira 2014-05-03 21:52:01

2 réponses

l'exécution des travaux peut être empêchée en réglant

spring.batch.job.enabled=false

en application.propriété. Ou vous pouvez utiliser spring.batch.job.names il prend une liste délimitée par une virgule des noms de tâches qui seront exécutées.

tiré de ici: comment arrêter les travaux programmés par lots au printemps de courir à la première fois lors de l'exécution du code?

50
répondu Evgeni Dimitrov 2017-05-23 12:34:50

vous pouvez activer l'exécution d'une tâche en utilisant le poste de contrôleur rest:

@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
répondu dmotta 2018-06-19 03:11:38