web-dev-qa-db-fra.com

exécuter un travail par lots de printemps à partir du contrôleur

J'essaie d'exécuter mon travail par lots à partir d'un contrôleur. Il sera déclenché par un travail cron ou en accédant à un lien spécifique. J'utilise Spring Boot, pas d'annotations XML juste.

Dans mon environnement actuel, j'ai un service qui contient les beans suivants:

@EnableBatchProcessing
@PersistenceContext
public class batchService {

    @Bean
    public ItemReader<Somemodel> reader() {
        ...
    }

    @Bean
    public ItemProcessor<Somemodel, Somemodel> processor() {
        return new SomemodelProcessor();
    }

    @Bean
    public ItemWriter writer() {
        return new CustomItemWriter();
    }

    @Bean
    public Job importUserJob(JobBuilderFactory jobs, Step step1) {
        return jobs.get("importUserJob")
                .incrementer(new RunIdIncrementer())
                .flow(step1)
                .end()
                .build();
    }

    @Bean
    public Step step1(StepBuilderFactory stepBuilderFactory,       
            ItemReader<somemodel> reader,
            ItemWriter<somemodel> writer,
            ItemProcessor<somemodel, somemodel> processor) {

        return stepBuilderFactory.get("step1")
                .<somemodel, somemodel> chunk(100)
                .reader(reader)
                .processor(processor)
                .writer(writer)
                .build();
    }   
}   

Dès que j'ai mis le @Configuration annotation au-dessus de ma classe batchService, le travail démarrera dès que j'exécuterai l'application. Il s'est terminé avec succès, tout va bien. Maintenant, j'essaie de supprimer l'annotation @Configuration et de l'exécuter à tout moment. Existe-t-il un moyen de le déclencher depuis le contrôleur?

Merci!

14
Damian

Vous pouvez lancer un travail par lots par programmation en utilisant JobLauncher qui peut être injecté dans votre contrôleur. Voir documentation Spring Batch pour plus de détails, y compris cet exemple de contrôleur:

@Controller
public class JobLauncherController {

    @Autowired
    JobLauncher jobLauncher;

    @Autowired
    Job job;

    @RequestMapping("/jobLauncher.html")
    public void handle() throws Exception{
        jobLauncher.run(job, new JobParameters());
    }
}
18
Andy Wilkinson

Vous devez créer un fichier application.yml dans le src/main/resources et ajouter la configuration suivante:

spring.batch.job.enabled: false

Avec cette modification, le travail par lots ne s'exécutera pas automatiquement au démarrage de Spring Boot. Et le travail par lots sera déclenché lors d'un lien spécifique.

Découvrez mon exemple de code ici: https://github.com/pauldeng/aws-elastic-beanstalk-worker-spring-boot-spring-batch-template

24
Paul Deng

Puisque vous utilisez Spring Boot, vous devez laisser le @Configuration annotation et configurez plutôt votre application.properties pour ne pas lancer les travaux au démarrage. Vous pouvez en savoir plus sur les options de configuration automatique pour exécuter des travaux au démarrage (ou non) dans la documentation Spring Boot ici: http://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/ htmlsingle/# howto-execute-spring-batch-jobs-on-startup

4
Michael Minella