Es ist ein Memorandum, weil ich versucht habe, mit Spring Boot regelmäßig auszuführen und asynchron zu verarbeiten.
OpenJDK 11 Spring Boot 2.2.1
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 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.
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.
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.
So führen Sie Aufgaben regelmäßig mit Spring Boot aus using @Scheduled and @Async together?
Recommended Posts