Maison  >  Article  >  Java  >  Comment Spring intègre Quartz pour mettre en œuvre la planification des tâches planifiées

Comment Spring intègre Quartz pour mettre en œuvre la planification des tâches planifiées

高洛峰
高洛峰original
2017-02-07 15:19:251701parcourir

Les projets récents doivent mettre en œuvre des tâches d'exécution planifiées, telles que le calcul régulier des points des membres, l'appel d'interfaces tierces, etc. Étant donné que le projet utilise le framework Spring, nous le présenterons ici en conjonction avec le framework Spring.

Écrivez une classe d'emploi

qui est un pojo ordinaire, comme suit :

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

Définissez des tâches spécifiques dans le fichier de configuration Spring

<?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>

Remarque

Un déclencheur ne peut déclencher qu'un seul Job, mais un Job peut être déclenché par plusieurs déclencheurs, ce qui entraînera des problèmes de concurrence. Dans Quartz, si vous ne souhaitez pas exécuter le même Job simultanément, vous pouvez implémenter StatefulJob au lieu de Job. Si vous utilisez MethodInvokingJobDetailFactoryBean au Spring, vous pouvez y parvenir en définissant l'attribut concurrent="false".

Notes de fin

Les avantages de l'utilisation de Quartz in Spring au lieu d'une application distincte incluent :

Le fait de placer tous les paramètres de planification des tâches au même endroit facilite la maintenance des tâches.

Seuls l'encodage du travail, du déclencheur et du planificateur peuvent être définis via la configuration

Pojo Java Bean peut être utilisé pour exécuter le travail sans implémenter l'interface du travail

Utilisation détaillée de Cron expression

Champ Valeurs autorisées Caractères spéciaux autorisés

Secondes 0-59, - * /
Minutes 0-59, - * /
Heures 0-23, - * /
Date 1-31, - * ? / L W C
Mois 1-12 ou JAN-DEC, - * /
Semaine 1-7 ou SUN-SAT, - * / L C #
? Année (vous pouvez sélectionner) Laisser vide, 1970-2099, - * /

Exemple :

0/5 * * * * ? : Exécuter toutes les 5 secondes

"" Le caractère est utilisé pour spécifier toutes les valeurs. Par exemple : « » signifie « chaque minute » dans le champ des minutes.

Le caractère "?" n'est utilisé que dans les champs de date et les champs de jour de la semaine. Il est utilisé pour spécifier des « valeurs non explicites ». Ceci est utile lorsque vous devez spécifier quelque chose dans l'un de ces deux champs. Vous comprendrez en regardant l’exemple ci-dessous.

Les deux éléments jour du mois et jour de la semaine s'excluent mutuellement. Vous devez définir un point d'interrogation pour indiquer que vous ne souhaitez pas définir ce champ.

Le caractère "-" est utilisé pour spécifier une plage. Par exemple : « 10-12 » dans le domaine des heures signifie « 10 heures, 11 heures, 12 heures ».

Les caractères "," sont utilisés pour spécifier des valeurs supplémentaires. Par exemple : « MON, WED, FRI » signifie « lundi, mercredi, vendredi » dans le champ du jour de la semaine.

Le caractère "/" permet de préciser l'incrément. Par exemple : « 0/15 » dans le champ des secondes signifie 0, 15, 30 et 45 secondes par minute. « 5/15 » dans le champ des minutes signifie 5, 20, 35 et 50 de chaque heure. Le symbole "" devant "/" (tel que : /10) équivaut à 0 devant "/" (tel que : 0/10). Rappelez-vous l'essence : chaque champ numérique de l'expression est un ensemble avec des valeurs maximales et minimales. Par exemple : l'ensemble du champ des secondes et du champ des minutes est 0-59, le champ date est 1-31 et le champ mois est 1-. 12. Le caractère "/" peut vous aider à obtenir la valeur correspondante dans chaque champ de caractère. Par exemple : lorsque "7/6" est dans le champ du mois, il ne sera déclenché qu'en juillet, pas tous les mois de juin.

L est une abréviation de « dernier » et peut représenter les champs jour du mois et jour de la semaine, mais les significations dans les deux champs sont différentes. Par exemple, le jour du mois. le champ représente un mois le dernier jour. Si le champ du jour de la semaine représente « 7 » ou « SAT », si un nombre est ajouté devant le champ du jour de la semaine, il représente les derniers jours du mois. Par exemple, « 6L » représente. le dernier jour du mois.

Le caractère "W" n'est autorisé que dans les champs de date. Ce caractère permet de préciser le jour ouvrable le plus proche de la date. Par exemple : Si vous écrivez « 15W » dans le champ date, cela signifie : le jour ouvrable le plus proche le 15 de ce mois. Ainsi, si le 15 tombe un samedi, la tâche sera déclenchée le 14. Si le 15 tombe un dimanche, la tâche sera déclenchée le lundi, qui est le 16. Si vous renseignez "1W" dans le champ date, même si le 1er est un samedi, la tâche ne sera déclenchée que le lundi suivant, qui est le 3ème. Le jour ouvrable le plus récent spécifié par le caractère "W" ne peut pas s'étendre. mois. Le caractère « W » ne peut être utilisé qu'avec une seule valeur et ne peut pas être un champ numérique. Par exemple : 1-15W est faux.

"L" et "W" peuvent être utilisés ensemble dans le champ date, LW représente le jour ouvrable de la dernière semaine de ce mois.

Le caractère "#" ne peut apparaître que dans le champ du jour de la semaine. Ce caractère est utilisé pour spécifier un certain jour du mois. Par exemple : « 6#3 » signifie vendredi de la troisième semaine de ce mois (6 signifie vendredi, 3 signifie la troisième semaine). "2#1" signifie le lundi de la première semaine du mois. "4#5" signifie mercredi de la cinquième semaine.

Le caractère « C » est autorisé à apparaître dans le champ de date et dans le champ du jour de la semaine. Ce personnage s'appuie sur un "calendrier" spécifié. C'est-à-dire que la valeur de cette expression dépend du résultat du calcul du "calendrier" associé. S'il n'y a pas de "calendrier" associé, il est équivalent à tous les "calendriers" contenus. Par exemple, si le champ date est « 5C », cela signifie le premier jour du « calendrier » associé, soit 5 jours après le premier jour de ce mois. Si le champ semaine est "1C", cela signifie le premier jour du "calendrier" associé, ou le lendemain du premier jour de la semaine, c'est-à-dire le lendemain du dimanche (lundi).

Exemples d'expression

"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触发

La méthode ci-dessus de Spring intégrant Quartz pour implémenter la planification des tâches planifiées est tout le contenu partagé par l'éditeur. J'espère que cela pourra l'aider. est une référence pour tout le monde, et j'espère que tout le monde soutiendra le site Web PHP chinois.

Pour plus d'articles sur la façon dont Spring intègre Quartz pour implémenter la planification des tâches planifiées, veuillez prêter attention au site Web PHP chinois !

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn