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