[JAVA] Traitement asynchrone avec exécution régulière dans Spring Boot

Aperçu

C'est un mémorandum car j'ai essayé une exécution périodique et un traitement asynchrone avec Spring Boot.

environnement

OpenJDK 11 Spring Boot 2.2.1

Exécution périodique

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.

Traitement asynchrone

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é.

Faites-le en même temps

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.

Solution

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.

référence

Comment exécuter périodiquement des tâches avec Spring Boot using @Scheduled and @Async together?

Recommended Posts

Traitement asynchrone avec exécution régulière dans Spring Boot
Traitement asynchrone avec Spring Boot en utilisant @Async
Spring avec Kotorin --6 Traitement asynchrone
Exécution asynchrone des requêtes examinée dans Spring Boot 1.5.9
Traitement lors du démarrage d'une application avec Spring Boot
Envoyez des notifications régulières avec LineNotify + Spring Boot
Télécharger avec Spring Boot
Inclure le pot externe dans le package avec Spring boot2 + Maven3
Exécutez un traitement arbitraire après l'authentification de base avec Spring Boot.
SSO avec GitHub OAuth dans l'environnement Spring Boot 1.5.x
Jusqu'à ce que vous commenciez à développer avec Spring Boot dans eclipse 1
Jusqu'à ce que vous commenciez à développer avec Spring Boot dans eclipse 2
Création d'un environnement de base de données avec Docker dans Spring Boot (IntellJ)
Définir le paramètre contextuel dans Spring Boot
Générer un code à barres avec Spring Boot
Hello World avec Spring Boot
Implémenter GraphQL avec Spring Boot
Démarrez avec Spring Boot
Bonjour tout le monde avec Spring Boot!
Multi-projets Spring Boot 2 avec Gradle
Exécutez LIFF avec Spring Boot
Connexion SNS avec Spring Boot
Téléchargement de fichiers avec Spring Boot
Spring Boot commençant par copie
Spring Boot à partir de Docker
Hello World avec Spring Boot
Définir des cookies avec Spring Boot
Utiliser Spring JDBC avec Spring Boot
Changements majeurs dans Spring Boot 1.5
Ajouter un module avec Spring Boot
Premiers pas avec Spring Boot
NoHttpResponseException dans Spring Boot + WireMock
Créer un micro service avec Spring Boot
Envoyer du courrier avec Spring Boot
Exécution du traitement initial à l'aide de Spring Boot Command Line Runner
Utilisez thymeleaf3 avec le parent sans spécifier spring-boot-starter-parent dans Spring Boot
Utiliser l'authentification de base avec Spring Boot
Développement d'applications Spring Boot dans Eclipse
Essayez d'implémenter le traitement asynchrone dans Azure
gRPC sur Spring Boot avec grpc-spring-boot-starter
Créez une application avec Spring Boot 2
Déploiement à chaud avec le développement Spring Boot
Liaison de base de données avec doma2 (Spring boot)
Écrire du code de test avec Spring Boot
Programmation Spring Boot avec VS Code
Jusqu'à "Hello World" avec Spring Boot
Créer une application d'enquête avec Spring Boot
Obtenez des résultats de validation avec Spring Boot
Implémentation du traitement asynchrone dans Tomcat
(Intellij) Hello World avec Spring Boot
Créez une application avec Spring Boot
Implémenter l'API REST avec Spring Boot
Qu'est-ce que @Autowired dans Spring Boot?
Google Cloud Platform avec Spring Boot 2.0.0
Le traitement des événements est effectué au printemps.
Implémenter l'application Spring Boot dans Gradle
J'ai essayé GraphQL avec Spring Boot
[Java] Intégration LINE avec Spring Boot
À partir de Spring Boot 0. Utilisez Spring CLI