Il existe de très bonnes approches pour exécuter des tâches en mode asynchrone avec Spring, c'est juste une question de comment est configuré le JobLauncher
. Le JobLauncher
a une propriété taskExecutor
et l'exécution asynchrone peut être activée en fonction de l'implémentation affectée à cette propriété.
Vous pouvez trouver tous les types TaskExecutor
que Spring peut fournir et, en fonction de vos besoins, sélectionnez la meilleure approche pour accomplir vos tâches asynchrones par lots. Par exemple, SimpleAsyncTaskExecutor
est un exécuteur de tâches qui va créer un nouveau Thread
sur n'importe quel appel et qui pourrait générer un problème de performance si l'exécution s'exécute à haute fréquence. D'un autre côté, il existe également des types TaskExecutors
qui fournissent des fonctionnalités de regroupement afin de réutiliser les ressources et de maximiser l'efficacité du système.
Voici un petit exemple de la façon dont configurer un ThreadPoolTaskExecutor
:
A) Configurer ThreadPoolTaskExecutor Bean
@Bean
public ThreadPoolTaskExecutor taskExecutor() {
ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();
taskExecutor.setCorePoolSize(15);
taskExecutor.setMaxPoolSize(20);
taskExecutor.setQueueCapacity(30);
return taskExecutor;
}
B) Configurer JobLauncher Bean
@Bean
public JobLauncher jobLauncher(ThreadPoolTaskExecutor taskExecutor, JobRepository jobRepository){
SimpleJobLauncher jobLauncher = new SimpleJobLauncher();
jobLauncher.setTaskExecutor(taskExecutor);
jobLauncher.setJobRepository(jobRepository);
return jobLauncher;
}
C) Injecter votre JobLauncher
et votre Jobs
configuration
@Autowired
private JobLauncher jobLauncher;
@Autowired
@Qualifier("job1-file-A")
private Job job1;
@Autowired
@Qualifier("job2-file-B")
private Job job2;
D) Planifier les travaux
@Scheduled(cron = "*/1 * * * * *")
public void run1(){
Map<String, JobParameter> confMap = new HashMap<>();
confMap.put("time", new JobParameter(System.currentTimeMillis()));
JobParameters jobParameters = new JobParameters(confMap);
try {
jobLauncher.run(job1, jobParameters);
}catch (Exception ex){
logger.error(ex.getMessage());
}
}
@Scheduled(cron = "*/1 * * * * *")
public void run2(){
Map<String, JobParameter> confMap = new HashMap<>();
confMap.put("time", new JobParameter(System.currentTimeMillis()));
JobParameters jobParameters = new JobParameters(confMap);
try {
jobLauncher.run(job2, jobParameters);
}catch (Exception ex){
logger.error(ex.getMessage());
}
}
E) Enfin sur votre classe SpringBoot @EnableBatchProcessing
et @EnableScheduling
@EnableBatchProcessing
@EnableScheduling
@SpringBootApplication
public class MyBatchApp {