C'est un mémorandum car j'ai essayé une exécution périodique et un traitement asynchrone avec Spring Boot.
OpenJDK 11 Spring Boot 2.2.1
Je l'ai mentionné ici. Comment exécuter périodiquement des tâches avec Spring Boot
@EnableScheduling
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
@Scheduled(fixedRate = 10000)
public void scheduledTask() {
this.doTask();
}
Utilisez l'annotation Planifiée.
Les annotations asynchrones peuvent être utilisées pour le traitement asynchrone.
@EnableAsync
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
@Async
public void doTask() {
NormalTask normalTask = new NormalTask();
normalTask.do();
}
Lorsque la méthode doTask est appelée, le processus est exécuté dans un thread séparé.
Je pensais que cette combinaison permettrait une exécution périodique → un traitement asynchrone, mais la combinaison de Scheduled et Async n'entraîne pas un traitement asynchrone.
@Async
public void doTask() {
NormalTask normalTask = new NormalTask();
normalTask.do();
}
@Scheduled(fixedRate = 10000)
public void scheduled() {
this.doTask();
}
Dans l'exemple ci-dessus, Async ne fonctionne pas et normalTask.do () est bloqué.
La méthode avec l'annotation planifiée crée Runnable et la traite dans un autre thread, mais Async ne fonctionne pas pour le moment. ScheduledThreadPoolExecutor, qui gère l'exécution périodique, semble se bloquer jusqu'à la fin de run () de Runnable (pour calculer le prochain temps d'exécution périodique à partir de la fin).
Par conséquent, les annotations planifiées et asynchrones ne peuvent pas être utilisées ensemble.
Il a été résolu en créant un autre thread dans Runnable créé par Scheduled et en exécutant le processus. Je pense qu'il n'y a pas de problème car Runnable créé par Scheduled se termine dès qu'un autre thread pour le traitement asynchrone est créé.
AsyncTask.java
public class AsyncTask implements Runnable {
@Override
public void run() {
// Do some task
}
}
public void doTask() {
AsyncTask asyncTask = new AsyncTask();
Thread newThread = new Thread(asyncTask);
newThread.start();
}
@Scheduled(fixedRate = 10000)
public void scheduled() {
this.doTask();
}
Si vous avez des suggestions, n'hésitez pas à nous contacter.
Comment exécuter périodiquement des tâches avec Spring Boot using @Scheduled and @Async together?
Recommended Posts