Führen Sie geplante Hintergrundaufgaben in Spring aus
View more Tutorials:


Manchmal brauchen Sie in der Applikation eine Aufgabe, die implizit in der Applikation nach der vorhandenen Prozesse läuft, erstellen. Zum Beispiel die Erstellung der Datei sitemap, die email period schicken,...
@Scheduled ist eine Annotation zur Konfiguration eines Zeitplan (schedule). Sie wird in einer Methode verbindet und diese Methode läuft nach der Zeitplan, die durch @Scheduled konfiguriert wird
@Scheduled
public @interface Scheduled {
String cron() default "";
String zone() default "";
long fixedDelay() default -1;
String fixedDelayString() default "";
long fixedRate() default -1;
String fixedRateString() default "";
long initialDelay() default -1;
String initialDelayString() default "";
}
Das Attribut | Die Bezeichnung |
cron | Ist ein cron Ausdruck, aus der üblichen Ausdruck UN*X verlängert und es enthaltet 6 Felder "die Sekunde, Die Minute, die Stunde, Tag am Monat, der Monat, der Tag der Woche". es hilft bei der Bestimmung eines komplizierten Prozessp. (am Ende des Unterlagen mehr lesen).
|
zone | Eine Zeit-zone benutzt die cron Ausdruck. Nach der Standard ist das Attribut ein leerer String (d.h die lokale Zeit-zone vom Server wird benutzt). |
fixedDelay | Die Implementation der Ausdrücke wird annotiert (annotated). Nach der Erledigung haltet es in einem nach der Milisekunden bestimmten Zeitraum und dann implementiert es die nächsten Aufgabe.
|
fixedDelayString | Die Implementation der Ausdrücke wird annotiert (annotated). Nach der Erledigung haltet es in einem nach der Milisekunde bestimmten Zeitraum und dann implementiert es die nächste Aufgabe.
|
fixedRate | Die Implementation der Ausdrücke wird annotiert (annotated), mit einem bestimmten Zeitraum zwischen die Aufrufe.
|
fixedRateString | Die Implementation der Ausdrücke wird annotiert (annotated), mit einem bestimmten Zeitraum zwischen die Aufrufe.
|
initialDelay | Das Zeitraum nach der Milisekunde haltet vor der ersten Implementation, mit fixedRate() oder fixedDelay() benutzen.
|
initialDelayString | Das Zeitraum nach der Milisekunde haltet vor der ersten Implementation, mit fixedRate() oder fixedDelay() benutzen.
|
Um in einer Spring Applikation die Hintergrund-Aufgabe durchzuführen, sollen Sie sie konfigurieren um durch die Verwendung von @EnableScheduling planen (schedule) zu ermöglichen.

SchedulerConfig.java
package org.o7planning.sbschedule.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableScheduling;
@Configuration
@EnableScheduling
public class SchedulerConfig {
// Declaring the beans are related to the schedule here if necessary.
}
Das ist das einfachste Beispiel, das benutzt @Schedule mit dem Attribute von fixedDelay. Im Beispiel drück die Aufgabe auf dem Bildschirm Console die Zeit aus. Nach der Ende der Aufgabe stoppt sie fixedDelay Sekunde bevor sie die Aufgabe implementiert


WriteCurrentTimeSchedule.java
package org.o7planning.sbschedule.schedule;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
@Component
public class WriteCurrentTimeSchedule {
private static final DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss sss");
// initialDelay = 3 second.
// fixedDelay = 2 second.
@Scheduled( initialDelay = 3 * 1000, fixedDelay = 2 * 1000)
public void writeCurrentTime() {
Date now = new Date();
String nowString = df.format(now);
System.out.println("Now is: "+ nowString);
}
}
Sie können die Delay-Zeit für die erste Implementation konfigurieren (initialDelay), Nachdem die Applikation startet (start), wird die Aufgabe auf dem Ende der Delay-Zeit vor der ersten Implementation.
// miliseconds.
@Scheduled(fixedDelay = 2 * 1000, initialDelay = 30 * 1000)
public void writeCurrentTime() {
// Do something ..
}
fixedDelay vs fixedRate
Sie können nur entweder fixedDelay oder fixedRate im @Schedule annotation benutzen, Sie können nicht gleichzeitig die beide benutzen.
- fixedDelay ist die Zeitraum nach der Erledigung von der früheren Aufgabe, danach die Implementation der nächsten Aufgabe.
- fixedRate ist die die Zeitraum zwischen der Implementation der früheren Aufgabe und der Beginn der Implementation der nächsten Aufgabe. Es hängt nicht von der Erledigung der früheren Aufgabe ab
@Schedule erlaubt Sie bei der Einstellung der komplizierten Zeitplan, zum Beispiel: die Erledigung der Aufgabe in allen Montag um 12 Uhr. Um die komplizierten Zeitplan zu erledigen sollen Sie das Attribut cron.
Die Ausdrück cron ist die Vertretung von 6 Felder:
second, minute, hour, day of month, month, day(s) of week

Zum Beispiel
"0 0 * * * *" // the top of every hour of every day.
"*/10 * * * * *" // every ten seconds.
"0 0 8-10 * * *" // 8, 9 and 10 o'clock of every day.
"0 0/30 8-10 * * *" // 8:00, 8:30, 9:00, 9:30 and 10 o'clock every day.
"0 0 9-17 * * MON-FRI" // on the hour nine-to-seventeen, and monday to friday
"0 0 0 25 12 ?" // every Christmas Day at midnight
Davon
Das Zeichen | Die Bedeutung |
* | irgendwelcher entspechen |
*/X | alle X |
? | ("keine bestimmte Wert") - es ist nutzlich wenn Sie etwas in einem der 2 Felder (field) bestimmen, davon ein Feld erlaubt und der andere nicht. Zum Beispiel, wenn ich den 10.Tag im Monat, aber sorge nicht welches Tag in der Woche es ist, soll ich "10" im Feld day-of-month setzen und das Zeichen "?" im Feld day-of-week.setzen |

"0 0 0 25 12 ?":
Um 12h Mittelnacht (0 Uhr) am Weihnachten (25th Dezember) sorgen Sie welches Tag es ist

Das zone Attribut bestimmt die Time-Zone. die standardmäßige Wert vom zone ist leer, d.h die Zeit-zone vom Server benutzen.
@Scheduled(cron="0 1 1 * * *", zone="Europe/Istanbul")
public void doScheduledWork() {
// Do something here
}
Die folgende Tabelle bezeichnet die Liste der Zeit-Zone (Time zones), die durch Oracle Real-Time Collaboration unterstützt wird.
Internal Name | External User Visible Name |
---|---|
Pacific/Pago_Pago | (-11:00) Pago Pago |
Pacific/Honolulu | (-10:00) Hawaii |
America/Anchorage | (-09:00) Alaska |
America/Vancouver | (-08:00) Canada Pacific Time |
America/Los_Angeles | (-08:00) US Pacific Time |
America/Tijuana | (-08:00) Tijuana |
America/Edmonton | (-07:00) Canada Mountain Time |
America/Denver | (-07:00) US Mountain Time |
America/Phoenix | (-07:00) Arizona |
America/Mazatlan | (-07:00) Mazatlan |
America/Winnipeg | (-06:00) Canada Central Time |
America/Regina | (-06:00) Saskatchewan |
America/Chicago | (-06:00) US Central Time |
America/Mexico_City | (-06:00) Mexico City |
America/Guatemala | (-06:00) Guatemala |
America/El_Salvador | (-06:00) El Salvador |
America/Managua | (-06:00) Managua |
America/Costa_Rica | (-06:00) Costa Rica |
America/Montreal | (-05:00) Canada Eastern Time |
America/New_York | (-05:00) US Eastern Time |
America/Indianapolis | (-05:00) East Indiana |
America/Panama | (-05:00) Panama |
America/Bogota | (-05:00) Bogota |
America/Lima | (-05:00) Lima |
America/Halifax | (-04:00) Canada Atlantic Time |
America/Puerto_Rico | (-04:00) Puerto Rico |
America/Caracas | (-04:00) Caracas |
America/Santiago | (-04:00) Santiago |
America/St_Johns | (-03:30) Newfoundland |
America/Sao_Paulo | (-03:00) Sao Paulo |
Atlantic/Azores | (-01:00) Azores |
Etc./UTC | (00:00) Universal Time |
UTC | (00:00) Universal Time |
Atlantic/Reykjavik | (00:00) Reykjavik |
Europe/Dublin | (00:00) Dublin |
Europe/London | (00:00) London |
Europe/Lisbon | (00:00) Lisbon |
Africa/Casablanca | (00:00) Casablanca |
Africa/Nouakchott | (00:00) Nouakchott |
Europe/Oslo | (+01:00) Oslo |
Europe/Stockholm | (+01:00) Stockholm |
Europe/Copenhagen | (+01:00) Copenhagen |
Europe/Berlin | (+01:00) Berlin |
Europe/Amsterdam | (+01:00) Amsterdam |
Europe/Brussels | (+01:00) Brussels |
Europe/Luxembourg | (+01:00) Luxembourg |
Europe/Paris | (+01:00) Paris |
Europe/Zurich | (+01:00) Zurich |
Europe/Madrid | (+01:00) Madrid |
Europe/Rome | (+01:00) Rome |
Africa/Algiers | (+01:00) Algiers |
Africa/Tunis | (+01:00) Tunis |
Europe/Warsaw | (+01:00) Warsaw |
Europe/Prague | (+01:00) Prague Bratislava |
Europe/Vienna | (+01:00) Vienna |
Europe/Budapest | (+01:00) Budapest |
Europe/Sofia | (+02:00) Sofia |
Europe/Istanbul | (+02:00) Istanbul |
Europe/Athens | (+02:00) Athens |
Asia/Nicosia | (+02:00) Nicosia |
Asia/Beirut | (+02:00) Beirut |
Asia/Damascus | (+02:00) Damascus |
Asia/Jerusalem | (+02:00) Jerusalem |
Asia/Amman | (+02:00) Amman |
Africa/Tripoli | (+02:00) Tripoli |
Africa/Cairo | (+02:00) Cairo |
Africa/Johannesburg | (+02:00) Johannesburg |
Europe/Moscow | (+03:00) Moscow |
Asia/Baghdad | (+03:00) Baghdad |
Asia/Kuwait | (+03:00) Kuwait |
Asia/Riyadh | (+03:00) Riyadh |
Asia/Bahrain | (+03:00) Bahrain |
Asia/Qatar | (+03:00) Qatar |
Asia/Aden | (+03:00) Aden |
Africa/Khartoum | (+03:00) Khartoum |
Africa/Djibouti | (+03:00) Djibouti |
Africa/Mogadishu | (+03:00) Mogadishu |
Asia/Dubai | (+04:00) Dubai |
Asia/Muscat | (+04:00) Muscat |
Asia/Yekaterinburg | (+05:00) Yekaterinburg |
Asia/Tashkent | (+05:00) Tashkent |
Asia/Calcutta | (+05:30) India |
Asia/Novosibirsk | (+06:00) Novosibirsk |
Asia/Almaty | (+06:00) Almaty |
Asia/Dacca | (+06:00) Dacca |
Asia/Krasnoyarsk | (+07:00) Krasnoyarsk |
Asia/Bangkok | (+07:00) Bangkok |
Asia/Saigon | (+07:00) Vietnam |
Asia/Jakarta | (+07:00) Jakarta |
Asia/Irkutsk | (+08:00) Irkutsk |
Asia/Shanghai | (+08:00) Beijing, Shanghai |
Asia/Hong_Kong | (+08:00) Hong Kong |
Asia/Taipei | (+08:00) Taipei |
Asia/Kuala_Lumpur | (+08:00) Kuala Lumpur |
Asia/Singapore | (+08:00) Singapore |
Australia/Perth | (+08:00) Perth |
Asia/Yakutsk | (+09:00) Yakutsk |
Asia/Seoul | (+09:00) Seoul |
Asia/Tokyo | (+09:00) Tokyo |
Australia/Darwin | (+09:30) Darwin |
Australia/Adelaide | (+09:30) Adelaide |
Asia/Vladivostok | (+10:00) Vladivostok |
Australia/Brisbane | (+10:00) Brisbane |
Australia/Sydney | (+10:00) Sydney Canberra |
Australia/Hobart | (+10:00) Hobart |
Asia/Magadan | (+11:00) Magadan |
Asia/Kamchatka | (+12:00) Kamchatka |
Pacific/Auckland | (+12:00) Auckland |
Das Beispiel unten: die Aufgabe wird um 1h 20 am Montag, Dienstag, Wochentag und Donnerstag
"0 20 1 * * MON-THU"

CronSchedule.java
package org.o7planning.sbschedule.schedule;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
@Component
public class CronSchedule {
@Scheduled(cron = "0 20 1 * * MON-THU")
public void doSomething() {
System.out.println("Do some thing");
}
}