[JAVA] Asynchrone Verarbeitung mit regelmäßiger Ausführung in Spring Boot

Überblick

Es ist ein Memorandum, weil ich versucht habe, mit Spring Boot regelmäßig auszuführen und asynchron zu verarbeiten.

Umgebung

OpenJDK 11 Spring Boot 2.2.1

Periodische Ausführung

Ich habe hier darauf hingewiesen. So führen Sie Aufgaben regelmäßig mit Spring Boot aus

@EnableScheduling
@SpringBootApplication
public class DemoApplication {

	public static void main(String[] args) {
		SpringApplication.run(DemoApplication.class, args);
	}
}

@Scheduled(fixedRate = 10000)
public void scheduledTask() {
    this.doTask();
}

Verwenden Sie die Annotation Geplant.

Asynchrone Verarbeitung

Asynchrone Annotation kann für die asynchrone Verarbeitung verwendet werden.

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

Wenn die doTask-Methode aufgerufen wird, wird der Prozess in einem separaten Thread ausgeführt.

Mach es gleichzeitig

Ich dachte, dass diese Kombination eine periodische Ausführung → asynchrone Verarbeitung ermöglichen würde, aber die Kombination von geplant und asynchron führt nicht zu einer asynchronen Verarbeitung.

@Async
public void doTask() {
    NormalTask normalTask = new NormalTask();
    normalTask.do();
}

@Scheduled(fixedRate = 10000)
public void scheduled() {
    this.doTask();
}

Im obigen Beispiel funktioniert Async nicht und normalTask.do () ist blockiert.

Die Methode mit der geplanten Annotation erstellt Runnable und verarbeitet sie in einem anderen Thread, aber Async funktioniert derzeit nicht. ScheduledThreadPoolExecutor, der die periodische Ausführung verwaltet, scheint bis zum Ende von Runnables run () zu blockieren (um die nächste periodische Ausführungszeit ab dem Ende zu berechnen).

Daher können geplante und asynchrone Annotationen nicht zusammen verwendet werden.

Lösung

Es wurde gelöst, indem ein weiterer Thread in Runnable erstellt wurde, der von Scheduled erstellt wurde, und der Prozess darin ausgeführt wurde. Ich denke, dass es kein Problem gibt, da Runnable, das von Scheduled erstellt wurde, endet, sobald ein weiterer Thread für die asynchrone Verarbeitung erstellt wird.

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

Wenn Sie Vorschläge haben, können Sie sich gerne an uns wenden.

Referenz

So führen Sie Aufgaben regelmäßig mit Spring Boot aus using @Scheduled and @Async together?

Recommended Posts

Asynchrone Verarbeitung mit regelmäßiger Ausführung in Spring Boot
Asynchrone Verarbeitung mit Spring Boot unter Verwendung von @Async
Feder mit Kotorin --6 Asynchrone Verarbeitung
Untersuchte asynchrone Ausführung von Abfragen in Spring Boot 1.5.9
Verarbeitung beim Starten einer Anwendung mit Spring Boot
Senden Sie regelmäßige Benachrichtigungen mit LineNotify + Spring Boot
Mit Spring Boot herunterladen
Nehmen Sie das externe Glas mit Spring boot2 + Maven3 in das Paket auf
Führen Sie nach der Standardauthentifizierung mit Spring Boot eine beliebige Verarbeitung aus.
SSO mit GitHub OAuth in der Spring Boot 1.5.x-Umgebung
Bis Sie mit der Entwicklung mit Spring Boot in Eclipse 1 beginnen
Bis Sie mit der Entwicklung mit Spring Boot in Eclipse 2 beginnen
Erstellen einer Datenbankumgebung mit Docker in Spring Boot (IntellJ)
Legen Sie den Kontextparameter in Spring Boot fest
Generieren Sie mit Spring Boot einen Barcode
Hallo Welt mit Spring Boot
Implementieren Sie GraphQL mit Spring Boot
Beginnen Sie mit Spring Boot
Hallo Welt mit Spring Boot!
Spring Boot 2 Multiprojekt mit Gradle
Führen Sie LIFF mit Spring Boot aus
SNS-Login mit Spring Boot
Datei-Upload mit Spring Boot
Spring Boot beginnt mit dem Kopieren
Spring Boot beginnend mit Docker
Hallo Welt mit Spring Boot
Setzen Sie Cookies mit Spring Boot
Verwenden Sie Spring JDBC mit Spring Boot
Wichtige Änderungen in Spring Boot 1.5
Modul mit Spring Boot hinzufügen
Erste Schritte mit Spring Boot
NoHttpResponseException in Spring Boot + WireMock
Erstellen Sie mit Spring Boot einen Mikrodienst
Mail mit Spring Boot verschicken
Ausführen der Erstverarbeitung mit Spring Boot Command Line Runner
Verwenden Sie thymeleaf3 mit parent, ohne Spring-Boot-Starter-Parent in Spring Boot anzugeben
Verwenden Sie die Standardauthentifizierung mit Spring Boot
Spring Boot-Anwendungsentwicklung in Eclipse
Versuchen Sie, die asynchrone Verarbeitung in Azure zu implementieren
gRPC auf Spring Boot mit grpc-spring-boot-Starter
Erstellen Sie eine App mit Spring Boot 2
Hot Deploy mit Spring Boot-Entwicklung
Datenbankverknüpfung mit doma2 (Spring Boot)
Schreiben Sie den Testcode mit Spring Boot
Spring Boot Programmierung mit VS Code
Bis "Hallo Welt" mit Spring Boot
Erstellen Sie eine Anfrage-App mit Spring Boot
Erhalten Sie Validierungsergebnisse mit Spring Boot
Implementierung der asynchronen Verarbeitung in Tomcat
(Intellij) Hallo Welt mit Spring Boot
Erstellen Sie eine App mit Spring Boot
Implementieren Sie die REST-API mit Spring Boot
Was ist @Autowired im Spring Boot?
Google Cloud Platform mit Spring Boot 2.0.0
Die Ereignisverarbeitung wird im Frühjahr durchgeführt.
Implementieren Sie die Spring Boot-Anwendung in Gradle
Ich habe GraphQL mit Spring Boot ausprobiert
[Java] LINE-Integration mit Spring Boot
Beginnend mit Spring Boot 0. Verwenden Sie Spring CLI