Dans le cadre de printemps, la tâche de synchronisation peut être implémentée via @Schedule. Grâce aux règles décrites par l'attribut Description de Cron, Spring appellera cette méthode.
Spring a mis en œuvre des tâches de synchronisation simplement et à peu près, pourquoi utiliser le quartz?
Si vous avez maintenant de nombreuses tâches chronométrées, les règles sont différentes, par exemple:
Dépendance Maven
<dependency> <proupId> org.quartz-sccheler </rompuprid> <letifactive> quartz </ artifactid> <version> 2.2.1 </ version> </pedigency> <dependency> <proupId> org.quartz-scheduler </proupId> <petifactid> Quartz-jobs </ptetifactid> <frision>> 2.2.1 </ version>
Ce qui suit est le code source du framework d'apprentissage open source bootdo
Je n'ai pas utilisé tous les champs, l'idée est d'interroger la DB en premier.
Encapsuler les deux objets suivants
Lorsque la condition de déclenchement est remplie, la classe sera trouvée sur la base de la caisse de bean définie (org.quartz.job doit être implémentée). À l'heure actuelle, les données du Jobdetail peuvent être récupérées et la logique métier spécifique peut être exécutée.
@ComponentPublic class WelcomeJob implémente le travail {@Override public void execute (jobExEcutionContext arg0) lève JobExEcutionException {// votre logique commerciale}}Structure de table
Créer la table `sys_task` (` id` bigint (20) pas null auto_increment, `cronexpression` varchar (255) commentaire null par défaut` `Cron Expression '',` Methodname` varchar (255) Commentaire par défaut `` Le nom de la méthode de l'appel de tâche '', `isConcurrent` Commentaire nul `` Description de la tâche '', `updateby` varchar (64) commentaire nulle par défaut« updator »,` `beanclass» varchar (255) commentaire nul par défaut »Quelle classe est appelée lorsque la tâche est exécutée ',` `Création' DateTime Null Commentaire« Créer du temps '', «Jobsatus» Varchar (255) Commentaire null neft commentaire »,« Contrôle de tâche »,` `Jobgroup ' `Updatedate` DateTime par défaut Commentaire nul« Temps de mise à jour »,` CreateBy` Varchar (64) Commentaire null «Créateur», `Springbean` Varchar (255) Commentaire null« Spring Bean »,` JobName »varchar (255) COMMENTAUX NULL« NULL », Clé primaire» (id`) moteur = innodb auto_increment = 3 Charset = utf8 Row_FORM = compact;
Classe de configuration
import java.io.ioException; import java.util.properties; import org.quartz.scheduler; import org.springframework.beans.factory.annotation.autowired; import org.springframework.beans.factory.config.propertiesfactorybean; importation; org.springframework.context.annotation.bean; import org.springframework.context.annotation.configuration; import org.springframework.core.io.classpathresource; import org.springframework.scheduling.quartz.schedulerfactorybean; Import com.txgl.common.quartz.factory.jobfactory; @configurationpublic class QuartzConfigration {@autowired jobFactory jobFactory; @Bean public schedulerfactoryBean schedulerFactoryBean () {SchedulerFactoryBean schedulerFactoryBean = new schedulerfactoryBean (); essayez {schedulerfactoryBean.setOverwriteExistJobs (true); SchedulerFactoryBean.SetHartzProperties (QuartzProperties ()); SchedulerFactoryBean.SetJobFactory (JobFactory); } catch (ioException e) {e.printStackTrace (); } return SchedulerFactoryBean; } // Spécifiez Quartz.Properties @Bean Public Properties QuartzProperties () lève IOException {PropertiesFactoryBean PropertiesFactoryBean = New PropertiesFactoryBean (); PropertiesFactoryBean.SetLocation (new ClassPathResource ("/ config / quartz.properties")); PropertiesFactoryBean.AfterPropertiseSet (); Retour PropertiesFactoryBean.getObject (); } // Créer un calendrier @Bean (name = "Scheduler") Public Scheduler Scheduler () {return SchedulerFactoryBean (). GetScheduler (); }}Le code de QuartzManager est la clé pour fonctionner sur les tâches en injectant le planificateur
import java.util.arraylist; import java.util.list; import java.util.set; import org.apache.log4j.logger; import org.quartz.cronschedulebuilder; import org.quartz.crontrigger; import org.quartz.datebuilder; import org.quartz.dateBuilder.Interner; org.quartz.job; import org.quartz.jobbuilder; import org.quartz.jobdetail; import org.quartz.jobexecutext; import org.quartz.jobke org.quartz.triggerbuilder; import org.quartz.triggerykey; import org.quartz.impl.matchers.groupmatcher; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.qualifier; importation; importation; import; org.springframework.scheduling.quartz.schedulerfactoryBean; import org.springframework.sterreotype.service; import org.springframework.web.context.support.springbeanautowiringSupport; import com.bootdo.common.quartz.factory. *; Importer com.bootdo.common.utils.springContextholder ;; / ** * * * @title: quartzmanager.java * @description: gestion de tâche planifiée * * / @ ServicePublic Class QuartzMercl (); // Private SchedulerFactoryBean SchedulerFactoryBean // = SpringContexTholder.getBean (SchedulerFactoryBean.class); // @Autowired // @qualifier ("SchedulerFactoryBean") // Private SchedulerFactoryBean SchedulerFactoryBean; @Autowired Private Scheduler Scheduler; / ** * Ajouter la tâche * * @param schedulejob * @throws schedulerexception * / public void addJob (scheduleJob Job) {try {// Créer une instance Jobdetail, lier la classe d'implémentation de l'emploi // spécifie le nom du travail, le nom du groupe et lie la classe de classe d'emploi <? étend Job> JobClass = (class <? étend Job>) (class.Forname (job.getBeANClass ()). NewInstance () .getClass ()); Jobdetail jobdetail = jobBuilder.newjob (jobclass) .WithIdentity (job.getJobName (), job.getJobgroup ()) // Nom de la tâche et groupe Formation de la clé de tâche .build (); // Définir la règle de déclenchement de répartition // Utiliser la règle de corngrigger Trigger Trigger = TriggerBuilder.NewTrigger (). Withentity (job.getJobname (), job.getJobgroup ()) // Trigger Key .Startat (DateBuilder.Futuredate (1, IntervalUnit.second))) .WithSchedule (CronscheduleBuilder.Cronschedule (job.getCronexpression ())). startNow (). build (); // Enregistrez le travail et déclenchez dans la tâche Scheduler.ScheduleJob (JobDetail, Trigger); // Démarrer if (! Scheduler.isshutdown ()) {scheduler.start (); }} catch (exception e) {e.printStackTrace (); }} // public void addJob (schedulejob Job) lève la planification de schedulerexception {// if (job == null ||! schedulejob.status_running.equals (job.getJobStatus ())) {// return; //} ////trigkey trgergke job.getJobGroup ()); //// CronTrigger Trigger = (CronTrigger) scheduler.getTrigger (TriggerKey); //// // if (null == Trigger) {// class <? Étend Job> Clazz = schedulejob.concurrent_is.equals (job.getSConCurrent ()) //? Quartzjobfactory.class //: quartzjobfactorydisallowconcurrentExecution.class; //// jobdetail jobdetail = jobbuilder.newjob (Clazz) .WithIdentity (job.getJobname (), job.getjobgroup ()). Build (); /// jobdetail.getJobDatAmap (). put ("schedulejob", job); //// CRONSCHEDULEBUILDER ScheduleBuilder = CronscheduleBuilder.CrORSCHEDULE (job.getCronexpression ()); ////triger = TriggerBuilder.Newtrigger (). avec Identitity (job.getjobname (),,),). job.getJobGroup ()) // .WithSchedule (scheduleBuilder) .build (); //// Scheduler.ScheduleJob (Jobdetail, Trigger); //} else {// // Trigger exists, puis mettez à jour les paramètres de synchronisation correspondants ///////// / façon de ConscheduleBuilderbuilterbuilder = CronscheduleBuilder.Cronschedule (Job.getCronexpression ()); /// // Rebuild Trigger selon la nouvelle expression de cronexpression //// Trigger = Trigger.getTriggerBuilder (). Witidentity (TriggerKey) .WithSchedule (ScheduleBuilder). Scheduler.RescheduleJob (TriggerKey, Trigger); //} //} / ** * Obtenez la liste de toutes les tâches planifiées * * @return * @throws schedulerexception * / public list <chebyJob> getAllJob () lance schedulerexception {groupMatcher <jobkey> matchmer = groupematcher.anyJobgroup (); Set <JobKey> jobkeys = scheduler.getJobkeys (Matcher); List <la scheduleJob> joblist = new ArrayList <la scheduleJob> (); pour (JobKey JobKey: jobkeys) {list <? étend le déclencheur> déclencheur = scheduler.getTriggersofJob (jobKey); pour (déclencheur de déclenchement: déclencheurs) {calendrier job = new scheduleJob (); job.setJobName (jobKey.getName ()); job.setJobGroup (jobKey.getGroup ()); job.setDescription ("Trigger:" + Trigger.getKey ()); Trigger.triggerstate Tiggerstate = scheduler.getTriggerState (Trigger.getKey ()); job.setJobStatus (TigGerstate.Name ()); if (déclencheur instruction de CronTrigger) {CronTrigger CronTrigger = (CronTrigger) Trigger; String crOnexpression = CronTrigger.getCronexpression (); job.setcronexpression (cronexpression); } Joblist.add (Job); }} return Joblist; } / ** * Tous les travaux en cours d'exécution * * @return * @throws schedulerexception * / public list <la scheduleJob> getrunningJob () lève la planification de schedulerexception {list <jobExEcutionContext> exectuteJobs = scheduler.getCurrentelyExEcutingJobs (); List <la schedulejob> joblist = new ArrayList <la scheduleJob> (exécutingJobs.size ()); pour (jobExEcutionContext ExecutionJob: ExecutionJobs) {scheduleJob Job = new scheduleJob (); JobDetail jobDetail = ExecutionJob.getJobDetail (); JobKey jobKey = jobdetail.getKey (); Trigger Trigger = ExecutionJob.getTrigger (); job.setJobName (jobKey.getName ()); job.setJobGroup (jobKey.getGroup ()); job.setDescription ("Trigger:" + Trigger.getKey ()); Trigger.triggerstate Tiggerstate = scheduler.getTriggerState (Trigger.getKey ()); job.setJobStatus (TigGerstate.Name ()); if (déclencheur instruction de CronTrigger) {CronTrigger CronTrigger = (CronTrigger) Trigger; String crOnexpression = CronTrigger.getCronexpression (); job.setcronexpression (cronexpression); } Joblist.add (Job); } return Joblist; } / ** * Pause un travail * * @param schedulejob * @throws schedulerexception * / public void pauseJob (schedulejob schedJob) lève la planification de schémas {jobKey jobKey = jobKey.jobKey (schedulejob.getJobName (), scheduleJob.getJobgroup ()); Scheduler.PauseJob (JobKey); } / ** * Restauration d'un travail * * @param schedulejob * @throws schedulerexception * / public void remeMejob (schedulejob schedJob) lève la planification de schémas {jobKey jobKey = jobKey.jobKey (scheduleJob.getJobName (), scheduleJob.getJobgroup ()); Scheduler.ResumeJob (JobKey); } / ** * Supprimer un travail * * @param schedulejob * @throws schedulerexception * / public void DeleteJob (schedulejob schedJob) lève la planification de rcheduxception {jobKey jobKey = jobkey.jobKey (scheduleJob.getJobName (), scheduleJob.getJobgroup ()); Scheduler.DeleteJob (JobKey); } / ** * Exécuter le travail immédiatement * * @param schedulejob * @throws schedulerexception * / public void runajobnow (schedulejob schedJob) lance schedulerexception {jobKey jobKey = jobkey.jobKey (schedulejob.getJobName (), schedulejob.getJobgroup ()); Scheduler.triggerJob (JobKey); } / ** * Mise à jour de l'expression du temps de travail * * @param schedulejob * @throws schedulerexception * / public void updateJobcron (schedulejob schedJob) lève la planification de randularexception {TriggerKey TriggerKkey = TriggerKey.TriggerKey (scheduleJob.getJobName (), scheduleJob.getJobgroup ()); CronTrigger Trigger = (CronTrigger) Scheduler.GetTrigger (TriggerKey); CRONSCHEDULEBUILDER SHANDALBULDER = CRONSCHEDULEBUILDER.CRONSCHEDULE (SALANDJOB.GETCRONEXPRESSION ()); Trigger = Trigger.getTriggerBuilder (). Withentity (TriggerKey) .WithSchedule (scheduleBuilder) .Build (); Scheduler.RescheduleJob (TriggerKey, Trigger); }}Mise en œuvre du service
import com.bootdo.common.config.constant; import com.bootdo.common.dao.taskdao; import com.bootdo.common.domain.schedulejob; import com.bootdo.common.domain.taskdo; import com.bootdo.common.quartz.utils.quartzo com.bootdo.common.service.jobservice; import com.bootdo.common.utils.schedulejobutils; import org.quartz.schedulerexception; import org.springframework.beans.factory.annotation.Autowired; import org.springframework. java.util.hashmap; import java.util.list; import java.util.map; @ServicePublic class watcherviceIMPl implémente whatService {@autowired private taskdao taskschedulejobmapper; @Autowired QuartzManager QuartzManager; @Override public taskdo get (long id) {return tasksCheDuleJobmapper.get (id); } @Override Public List <TaskDo> liste (map <string, objet> map) {return taskschedulejobmapper.list (map); } @Override public int count (map <string, objet> map) {return taskscheduleJobmapper.Count (map); } @Override public int save (taskdo taskschedulejob) {return taskschedulejobmapper.save (taskschedulejob); } @Override public int update (taskdo taskschedulejob) {return taskschedulejobmapper.update (taskschedulejob); } @Override public int dis dove (long id) {try {taskdo schedJob = get (id); QuartzManager.DeleteJob (scheduleJobutils.entityTodata (scheduleJob)); retour taskschedulejobmapper.remove (id); } catch (schedulerexception e) {e.printStackTrace (); retour 0; }} @Override public int BatchRemove (long [] ids) {for (long id: ids) {try {taskdo schedJob = get (id); QuartzManager.DeleteJob (scheduleJobutils.entityTodata (scheduleJob)); } catch (schedulerexception e) {e.printStackTrace (); retour 0; }} RETOUR TASKSCHEDULEJOBMAPPER.BATCHREMOVE (IDS); } @Override public void initschedule () lève la planification de schedulerexception {// obtenir les données de la tâche des données ici lister <faskdo> joblist = taskschedulejobmapper.list (new hashmap <string, objet> (16)); for (taskdo schedJob: joblist) {if ("1" .equals (schedulejob.getJobStatus ())) {scheduleJob Job = scheduleJobutils.entityTodata (scheduleJob); Quartzmanager.addjob (Job); }}} @Override public void ChangeStatus (Long JobId, String cmd) lève ScheduleReXception {taskdo schedJob = get (jobId); if (scheduleJob == null) {return; } if (constant.status_running_stop.equals (cmd)) {quartzManager.DeleteJob (scheduleJobutils.entityTodata (schedJob)); schedJob.setJobStatus (schedulejob.status_not_running); } else {if (! constant.status_running_start.equals (cmd)) {} else {schedulejob.setJobStatus (schedulejob.status_running); quartzmanager.addjob (scheduleJobutils.entityTodata (schedulejob)); }} mise à jour (schedulejob); } @Override public void updatecron (long jobId) lève schedulerexception {taskdo schedJob = get (jobId); if (scheduleJob == null) {return; } if (schedulejob.status_running.equals (schedulejob.getJobStatus ())) {QuartzManager.updateJobcron (scheduleJobutils.entityTodata (scheduleJob)); } mise à jour (schedulejob); }}Démarrer un auditeur pour initialiser le quartz
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.commandlinerunner; import org.springframework.core.annotation.order; import org.springframework.steretype.comPonent; import com.bootdo.common.quartz.uts.quarts.quarts; com.bootdo.common.service.jobService; @ composant @ ordonnance (valeur = 1) Classe publique Planification JobinitListener implémente CommandLinerUnner {@Autowired JoberService ScheduleJobService; @Autowired QuartzManager QuartzManager; @Override public void run (string ... arg0) lève une exception {try {schedJobService.initsCheDule (); } catch (exception e) {e.printStackTrace (); }}}Ce qui précède est tout le contenu de cet article. J'espère que cela sera utile à l'apprentissage de tous et j'espère que tout le monde soutiendra davantage Wulin.com.