Heim  >  Artikel  >  Java  >  Wie Spring Quartz integriert, um die geplante Aufgabenplanung zu implementieren

Wie Spring Quartz integriert, um die geplante Aufgabenplanung zu implementieren

高洛峰
高洛峰Original
2017-02-07 15:19:251682Durchsuche

Neuere Projekte müssen geplante Ausführungsaufgaben implementieren, z. B. die regelmäßige Berechnung von Mitgliedspunkten, den Aufruf von Schnittstellen von Drittanbietern usw. Da das Projekt das Spring-Framework verwendet, werden wir es hier in Verbindung mit dem Spring-Framework vorstellen.

Schreiben Sie eine Jobklasse

, die ein gewöhnliches Pojo ist, wie folgt:

package com.pcmall.task;
 
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
 
public class TaskA {
    private static Logger logger = LoggerFactory.getLogger(TaskA.class);
    public void taskA1(){
        for(int i=0;i<100;i++){
            System.out.println("----A1----" + i);
        }
    }
    public void taskA2(){
        for(int i=0;i<100;i++){
            System.out.println("----A2----" + i);
        }
    }
}

Legen Sie bestimmte Aufgaben in der Spring-Konfigurationsdatei fest

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
     
    <bean id="taskA" class="com.pcmall.task.TaskA"></bean>
    <bean id="taskB" class="com.pcmall.task.TaskB"></bean>
     
    <bean id="taskJobA1" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
        <property name="targetObject" ref="taskA"></property>
        <property name="targetMethod" value="taskA1"></property>
        <property name="concurrent" value="false"></property>
    </bean>
    <bean id="taskJobA2" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
        <property name="targetObject" ref="taskA"></property>
        <property name="targetMethod" value="taskA2"></property>
        <property name="concurrent" value="false"></property>
    </bean>
    <bean id="taskJobB1" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
        <property name="targetObject" ref="taskB"></property>
        <property name="targetMethod" value="taskB1"></property>
        <property name="concurrent" value="false"></property>
    </bean>
    <bean id="taskJobB2" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
        <property name="targetObject" ref="taskB"></property>
        <property name="targetMethod" value="taskB2"></property>
        <property name="concurrent" value="false"></property>
    </bean>
     
    <bean id="taskA1Trigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
        <property name="jobDetail">
            <ref bean="taskJobA1" />
        </property>
        <property name="cronExpression">
            <value>0 0/1 * * * ?</value>
        </property>
    </bean>
    <bean id="taskA2Trigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
        <property name="jobDetail">
            <ref bean="taskJobA2" />
        </property>
        <property name="cronExpression">
            <value>0 0/2 * * * ?</value>
        </property>
    </bean>
     
    <bean id="taskB1Trigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
        <property name="jobDetail">
            <ref bean="taskJobB1" />
        </property>
        <property name="cronExpression">
            <value>0 0/1 * * * ?</value>
        </property>
    </bean>
 
    <bean id="taskB2Trigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
        <property name="jobDetail">
            <ref bean="taskJobB2" />
        </property>
        <property name="cronExpression">
            <value>0 0/2 * * * ?</value>
        </property>
    </bean>
 
    <bean id="scheduler"
        class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
        <property name="triggers">
            <list>
                <ref bean="taskA1Trigger" />
                <ref bean="taskA2Trigger" />
                <ref bean="taskB1Trigger" />
                <ref bean="taskB2Trigger" />
            </list>
        </property>
    </bean>
</beans>

Hinweis

Ein Trigger kann nur einen Job auslösen, aber ein Job kann durch mehrere Trigger ausgelöst werden, was zu Parallelitätsproblemen führt. Wenn Sie in Quartz nicht denselben Job gleichzeitig ausführen möchten, können Sie StatefulJob anstelle von Job implementieren. Wenn Sie MethodInvokingJobDetailFactoryBean in Spring verwenden, können Sie dies erreichen, indem Sie das Attribut concurrent="false" festlegen.

Endnotizen

Zu den Vorteilen der Verwendung von Quartz in Spring anstelle einer separaten Anwendung gehören:

Das Platzieren aller Aufgabenplanungseinstellungen an derselben Stelle erleichtert die Verwaltung von Aufgaben.

Nur ​​die Codierung des Jobs, Trigger und Scheduler können über die Konfiguration festgelegt werden

Pojo Java Bean kann zum Ausführen des Jobs verwendet werden, ohne die Job-Schnittstelle zu implementieren

Detaillierte Verwendung von Cron Ausdruck

Feld Erlaubte Werte Erlaubte Sonderzeichen

Sekunden 0-59, - * /
Minuten 0-59, - * /
Stunden 0-23, - * /
Datum 1-31, - * ? / L W C
Monat 1-12 oder JAN-DEZ, - * /
Woche 1-7 oder SO-SA, - * / L C #
Jahr (kann ausgewählt werden) Leer lassen, 1970-2099, - * /

Beispiel:

0/5 * * * * ?: Alle 5 Sekunden ausführen

"" Das Zeichen wird zur Angabe aller Werte verwendet. Beispiel: „“ bedeutet „jede Minute“ im Minutenfeld.

Das „?“-Zeichen wird nur in Datumsfeldern und Wochentagsfeldern verwendet. Es wird verwendet, um „nicht explizite Werte“ anzugeben. Dies ist nützlich, wenn Sie in einem dieser beiden Felder etwas angeben müssen. Sie werden es verstehen, wenn Sie sich das folgende Beispiel ansehen.

Die beiden Elemente „Tag des Monats“ und „Wochentag“ schließen sich gegenseitig aus. Sie sollten ein Fragezeichen setzen, um anzuzeigen, dass Sie dieses Feld nicht festlegen möchten.

Das Zeichen „-“ wird zur Angabe eines Bereichs verwendet. Beispiel: „10-12“ im Stundenbereich bedeutet „10 Uhr, 11 Uhr, 12 Uhr“.

Die ","-Zeichen werden verwendet, um zusätzliche Werte anzugeben. Beispiel: „MON, WED, FRI“ bedeutet „Montag, Mittwoch, Freitag“ im Feld „Wochentag“.

Das Zeichen „/“ wird zur Angabe der Schrittweite verwendet. Beispiel: „0/15“ im Sekundenfeld bedeutet 0, 15, 30 und 45 Sekunden pro Minute. „5/15“ im Minutenfeld bedeutet 5, 20, 35 und 50 jeder Stunde. Das Symbol „“ vor „/“ (z. B. /10) entspricht 0 vor „/“ (z. B. 0/10). Denken Sie an das Wesentliche: Jedes numerische Feld des Ausdrucks ist ein Satz mit Maximal- und Minimalwerten. Beispiel: Der Satz aus Sekundenfeld und Minutenfeld ist 0-59, das Datumsfeld ist 1-31 und das Monatsfeld ist 1-. 12. Das Zeichen „/“ kann Ihnen helfen, den entsprechenden Wert in jedem Zeichenfeld zu erhalten. Beispiel: „7/6“ im Monatsfeld wird nur im Juli ausgelöst, nicht jeden Juni.

L ist eine Abkürzung für „last“ und kann die Felder „Tag des Monats“ und „Tag der Woche“ darstellen, die Bedeutung in den beiden Feldern ist jedoch unterschiedlich. Beispielsweise stellt das Feld „Tag des Monats“ dar ein Monat. Wenn das Wochentagsfeld „7“ oder „SAT“ darstellt und vor dem Wochentagsfeld eine Zahl hinzugefügt wird, stellt es die letzten Tage des Monats dar. „6L“ steht beispielsweise für die letzten paar Tage des Monats Der letzte Tag des Monats.

Das Zeichen „W“ ist nur in Datumsfeldern erlaubt. Dieses Zeichen wird verwendet, um den nächsten Arbeitstag des Datums anzugeben. Beispiel: Wenn Sie „15W“ in das Datumsfeld schreiben, bedeutet dies: der nächste Werktag am 15. dieses Monats. Wenn also der 15. auf einen Samstag fällt, wird die Aufgabe am 14. ausgelöst. Fällt der 15. auf einen Sonntag, wird die Aufgabe am Montag, dem 16., ausgelöst. Wenn Sie „1W“ in das Datumsfeld eingeben, wird die Aufgabe erst am nächsten Montag ausgelöst, der der 3. ist, selbst wenn der 1. Tag ein Samstag ist. Der letzte durch das „W“-Zeichen angegebene Arbeitstag kann sich nicht erstrecken Monate. Das Zeichen „W“ kann nur mit einem einzelnen Wert verwendet werden und darf kein numerisches Feld sein. Beispiel: 1-15W ist falsch.

„L“ und „W“ können gemeinsam im Datumsfeld verwendet werden, LW steht für den Arbeitstag der letzten Woche dieses Monats.

Das Zeichen „#“ darf nur im Feld „Wochentag“ erscheinen. Dieses Zeichen wird verwendet, um einen bestimmten Tag im Monat anzugeben. Beispiel: „6#3“ bedeutet Freitag der dritten Woche dieses Monats (6 bedeutet Freitag, 3 bedeutet die dritte Woche). „2#1“ bedeutet Montag der ersten Woche des Monats. „4#5“ bedeutet Mittwoch der fünften Woche.

Das Zeichen „C“ darf im Datumsfeld und im Wochentagsfeld erscheinen. Dieses Zeichen ist auf einen angegebenen „Kalender“ angewiesen. Das heißt, der Wert dieses Ausdrucks hängt vom Berechnungsergebnis des zugehörigen „Kalenders“ ab. Wenn kein „Kalender“ zugeordnet ist, entspricht er allen enthaltenen „Kalendern“. Wenn das Datumsfeld beispielsweise „5C“ lautet, bedeutet dies den ersten Tag im zugehörigen „Kalender“ oder 5 Tage nach dem ersten Tag dieses Monats. Wenn das Wochenfeld „1C“ ist, bedeutet dies den ersten Tag im zugehörigen „Kalender“ oder den Tag nach dem ersten Tag der Woche, also den Tag nach Sonntag (Montag).

Ausdrucksbeispiele

"0 0 12 * * ?" 每天中午12点触发
"0 15 10 ? * *" 每天上午10:15触发
"0 15 10 * * ?" 每天上午10:15触发
"0 15 10 * * ? *" 每天上午10:15触发
"0 15 10 * * ? 2005" 2005年的每天上午10:15触发
"0 * 14 * * ?" 在每天下午2点到下午2:59期间的每1分钟触发
"0 0/5 14 * * ?" 在每天下午2点到下午2:55期间的每5分钟触发
"0 0/5 14,18 * * ?" 在每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发
"0 0-5 14 * * ?" 在每天下午2点到下午2:05期间的每1分钟触发
"0 10,44 14 ? 3 WED" 每年三月的星期三的下午2:10和2:44触发
"0 15 10 ? * MON-FRI" 周一至周五的上午10:15触发
"0 15 10 15 * ?" 每月15日上午10:15触发
"0 15 10 L * ?" 每月最后一日的上午10:15触发
"0 15 10 ? * 6L" 每月的最后一个星期五上午10:15触发
"0 15 10 ? * 6L 2002-2005" 2002年至2005年的每月的最后一个星期五上午10:15触发
"0 15 10 ? * 6#3" 每月的第三个星期五上午10:15触发

Die oben beschriebene Methode, mit der Spring Quartz zur Implementierung der geplanten Aufgabenplanung implementiert, ist der gesamte vom Herausgeber geteilte Inhalt. Ich hoffe, dass er dabei helfen kann ist eine Referenz für alle und ich hoffe, dass jeder die chinesische PHP-Website unterstützt.

Weitere verwandte Artikel darüber, wie Spring Quartz integriert, um die geplante Aufgabenplanung zu implementieren, finden Sie auf der chinesischen PHP-Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn