Springフレームワークでは、タイミングタスクは@scheduleを介して実装できます。 Cronの属性の説明で説明されているルールを通じて、Springはこの方法を呼び出します。
Springはタイミングタスクを簡単かつ大まかに実装しました。なぜQuartzを使用するのですか?
今すぐ多くのタイミングのタスクがある場合、ルールは異なります。たとえば
メイブン依存関係
<Dependency> groupId> org.Quartz-Scheduler </groupId> <Artifactid> Quartz </artifactid> <version> 2.2.1 </version> </dependency> <dependency> <groupid> org.quartz-scheduler </groupid> <artifactid> quartz-jobs </artifactid> </</</> </> <
以下は、Bootdoオープンソース学習フレームワークのソースコードです
私はすべてのフィールドを使用していませんでした。アイデアは、最初にDBを照会することです。
次の2つのオブジェクトをカプセル化します
トリガー条件が満たされると、セットビーンクラスに基づいてクラスが見つかります(org.quartz.jobを実装する必要があります)。この時点で、JobDetailのデータを取得し、特定のビジネスロジックを実行できます。
@componentPublic Class WelcomeJob Implements Job {@Override public void execute(jobexecutioncontext arg0)throws jobexecutionexception {// your business logic}}}テーブル構造
テーブル「sys_task」( `dull auto_increment、` cronexpression` varchar(255)デフォルトnullコメント「cron expression」、 `methodname` varchar(255)デフォルトnullコメント 'タスクコールの名前'、` isconcurrent` varchar(255)デフォルトのコメント(25555) `defaction null nullコメント '' os os emaction 'is e occoncurrent null null commentのデフォルトnullコメントではない、テーブル` sys_task`(20)null auto_incrementの作成を作成nullコメント「タスク説明」、「updateby` varchar(64)デフォルトのnullコメント「アップデーター」、「ビーンクラス」varchar(255)デフォルトヌルコメント」タスクが実行されたときに呼び出されるクラス '、「作成されたデフォルトヌルコメント」、 `jobstatus` varchar(255)defaul null' varchar(255)` jobgrup '、 `jobstatus` varchar(255)グループ化 '、 `updatedate` DateTimeデフォルトヌルコメント「更新時間」、「CreateBy` Varchar(64)デフォルトのコメント「作成者」、「Springbean」Varchar(255)デフォルトのヌルコメント「Spring Bean」、` Jobname(255)Default Null Comment' Task name ')Engine = binartbb charcement row_format = compact;
構成クラス
java.io.ioexception; Import java.util.properties; import org.quartz.scheduler; Import org.springframework.beans.factory.annotation.autowired; import org.springframework.beans.factory.config.popertiesfultext.ntringframework springframework.context.annotation.configuration; Import org.springframework.core.classpathresource; Import org.springframework.scheduling.quartz.schedulerfactorybean; Import com.txgl.common.quartorz.factory.factory.factory.factory.factory.factory.jobfacter @autowired jobfactory jobfactory; @bean public SchedulerFactoryBean SchedulerFactoryBean(){SchedulerFactoryBean SchedulerFactoryBean = new SchedulerFactoryBean(); try {SchedulerFactoryBean.SetOverWriteExistingJobs(true); SchedulerFactoryBean.SetQuartzProperties(QuartzProperties()); SchedulerFactoryBean.SetJobFactory(JobFactory); } catch(ioexception e){e.printstacktrace(); } return schedulerfactorybean; } // quartz.properties @bean public Properties quartzproperties()throws ioexception {propertiesFactoryBean PropertiesFactoryBean = new PropertiesFactoryBean(); propertiesFactoryBean.SetLocation(new ClassPathResource( "/config/Quartz.Properties")); propertiesFactoryBean.AfterPropertiesset(); return propertiesfactorybean.getObject(); } // schedule @bean(name = "scheduler")public scheduler scheduler(){return schedulerfactorybean()。getscheduler(); }}Quartzmanagerのコードは、スケジューラを注入することにより、タスクを操作する鍵です
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.datebuilder.datebuilder org.quartz.job; Import org.quartz.jobbuilder; Import org.quartz.jobdetail; Import org.quartz.jobexecutionContext; Import org.quartz.jobkey; Import org.quartz.scheduler; Import org.quartz.schedulectception; intedulectception; org.quartz.triggerbuilder; Import org.quartz.triggerkey; Import org.quartz.impl.matchers.groupMatcher; Import org.springframework.beans.factory.annotation.autowired; Import org.springframework.beans.annotation.Annotation. org.springframework.scheduling.quartz.schedulerfactorybean; Import org.springframework.stereotype.service; Import org.springframework.web.context.support.support.springbeanautowiringuptort; Import com.common.domon.domon.schedueport; com.bootdo.common.quartz.factory。 *; Import com.bootdo.common.utils.springcontextholder ;;/** * * * * @title:quartzmanager.java * @description:スケジュールされたタスク管理 * */ @servicepublic manager {public final grass); // private schedulerfactorybean schedulerfactorybean // = springcontextholder.getbean(schedulerfactorybean.class); // @autowired // @qualifier( "SchedulerFactoryBean")// private SchedulerFactoryBean SchedulerFactoryBean; @Autowiredプライベートスケジューラスケジューラ。 / ** * * * * @param scheduleJob * @Throws schedulerexception */ public void addjob(schedulejob job){// jobdetailインスタンスを作成し、ジョブの実装クラス//ジョブの名前、グループの名前、ジョブクラスのクラスを指定し、<? extends job> jobclass =(class <?extends job>)(class.forname(job.getbeanclass())。newinstance().getClass()); jobdetail jobdetail = jobbuilder.newjob(jobclass).withidentity(job.getjobname()、job.getjobgroup())//タスク名とグループはタスクキー.build(); //ディスパッチトリガールールを定義します.withschedule(cronschedulebuilder.cronschedule(job.getcronexpression()))。startnow()。build(); //ジョブを登録し、タスクスケジューラにトリガーをトリガーします。schedulejob(jobdetail、trigger); // if(!scheduler.isshutdown()){scheduler.start(); }} catch(例外e){e.printstacktrace(); }} // public void addjob(schedulejob job)schoodulerexception {// if(job == null ||!schedulejob.status_running.equals(job.getjobstatus()){// return; //} //// triggerkey triggerkey job.getjobgroup()); //// crontrigger trigger =(crontrigger)scheduler.gettrigger(triggerkey); // // if(null == trigger){// class <? Job> clazz = schedulejob.concurrent_is.equals(job.getisconcurrent())//? Quartzjobfactory.class //:Quartzjobfactorydisallowconcurrentexecution.class; //// jobdetail jobdetail = jobbuilder.newjob(clazz)。 jobdetail.getjobdatamap()。put( "schedulejob"、job); //// cronschedulebuilder schedulebuilder = cronschedulebuilder.cronschedule(job.getcronexpression(); job.getjobgroup())// .withschedule(schedulebuilder).build(); //// scheduler.schedulejob(jobdetail、trigger); //} else {// //トリガーは既に存在してから、対応するタイミングの設定////// cronschedulebuilder.cronschedule(job.getcronexpression()); ///// //新しいcronexpression式//// trigger = trigger.gettriggerbuilder()。トリガー/// Scheduler.rescheduleJob(TriggerKey、Trigger); //} //}/** *スケジュールされたすべてのタスクのリストを取得 * @return * @throws schedulexception */public list <scheduleJob> getAlljob()Throws ScheduleRexception {グループマッチャー<ジョブマッチー>グループマッチャー<jobkey> jobkeys = scheduler.getjobkeys(matcher);リスト<ScheduleJob> Joblist = new ArrayList <ScheduleJob>(); for(jobkey jobkey:jobkeys){list <?拡張トリガー> [triggers = scheduler.getTriggersofjob(jobkey); for(トリガートリガー:トリガー){schedulejob job = new ScheduleJob(); job.setjobname(jobkey.getname()); job.setjobgroup(jobkey.getgroup()); job.setdescription( "trigger:" + trigger.getKey()); trigger.triggerstate triggerstate = scheduler.getTrigGerstate(trigger.getKey()); job.setjobstatus(triggerstate.name()); if(crontriggerのトリガーインスタンス){crontrigger crontrigger =(crontrigger)トリガー; string cronexpression = crontrigger.getCroneXpression(); job.setcronexpression(cronexpression); } joblist.add(job); }} joblistを返します。 } / ** *すべての実行中のジョブ * * @return * @throws schedulerexception * / public list <ScheduleJob> getRunningJob()THROWS SCHREAULEXCEPTION {LIST <JoveExecutionContext> executeJobs = scheduler.getCurrentlyExecutingJobs(); List <ScheduleJob> Joblist = new ArrayList <ScheduleJob>(exectingJobs.size()); for(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 triggerstate = scheduler.getTrigGerstate(trigger.getKey()); job.setjobstatus(triggerstate.name()); if(crontriggerのトリガーインスタンス){crontrigger crontrigger =(crontrigger)トリガー; string cronexpression = crontrigger.getCroneXpression(); job.setcronexpression(cronexpression); } joblist.add(job); } joblistを返します。 } / ** *ジョブを一時停止 * * @param schedulejob * @throws schedulerexception * / public void pausejob(schedulejob schedulejob)スケジュールエクセプション{jobkey jobkey.jobkey(schedueljob.getjobname()、seachledjob.getjobgroup()); scheduler.pausejob(jobkey); } / ** *ジョブの復元 * * @param schedulejob * @throws schedulerexception * / public void resumejob(schedulejob schedulejob)スケジュールエクセプション{jobkey jobkey.jobkey(schedueljob.getjobname()、schedulejob.getjobgroup()); scheduler.resumejob(jobkey); } / ** *ジョブを削除 * * @param schedulejob * @throws schedulerexception * / public void deletejob(schedulejob schedulejob)スロースケジュールズプレックス{jobkey jobkey.jobkey(schedueljob.getjobname()、schedulejob.getjobgroup()); scheduler.deletejob(jobkey); } / ** *すぐにジョブを実行する * * @param schedulejob * @throws schedulerexception * / public void runajobnow(schedulejob seculdjob)スロー{jobkey jobkey.jobkey(schedulejob.getjobname()、schedulejob.getjobgroup()); scheduler.triggerjob(jobkey); } / ** * job expression * * @param schedulejob * @throws schedulerexception * / public void updatejobcron(schedulejob schedulejob)Sthrows schoodulerexception {triggerkeykey.triggerkey(schedueljob.getjobname()、schedewjob.getjobgroop(); crontrigger trigger =(crontrigger)scheduler.getTrigger(triggerkey); cronschedulebuilder schedulebuilder = cronschedulebuilder.cronschedule(schedulejob.getcronexpression()); trigger = trigger.getTriggerBuilder()。 scheduler.reschedulejob(triggerkey、trigger); }}サービスの実装
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.QuartzManager;import com.bootdo.common.service.jobservice; Import com.bootdo.common.utils.schedulejobutils; Import org.quartz.schedulerexception; Import org.springframework.beans.factory.annotation.autowired java.util.hashmap; Import java.util.list; import java.util.map; @servicepublic class jobererviceimpl explentice jobservice {@autowired private taskdaoskedulejobmapper; @Autowired Quartzmanager Quartzmanager; @override public taskdo get(long id){return taskschedulejobmapper.get(id); } @Override public List <TaskDo>リスト(Map <String、Object> Map){return taskschedulejobmapper.list(map); } @Override public int count(map <string、object> 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 remove(long id){try {taskdo schedulejob = get(id); Quartzmanager.deletejob(schedueljobutils.entitytodata(schedulejob)); return taskschedulejobmapper.remove(id); } catch(schedulerexception e){e.printstacktrace(); 0を返します。 }} @Override public int batchremove(long [] ids){for(long id:ids){try {taskdo schedulejob = get(id); Quartzmanager.deletejob(schedueljobutils.entitytodata(schedulejob)); } catch(schedulerexception e){e.printstacktrace(); 0を返します。 }} taskschedulejobmapper.batchremove(ids)を返します。 } @Override public void initschedule()Sthrows schedulerexception {//タスク情報データを取得します<taskdo> joblist = taskschedulejobmapper.list(new hashmap <string、object>(16)); for(taskdo schedulejob:joblist){if( "1" .equals(schedueljob.getjobstatus())){schedueljob job = schedulejobutils.entitytodata(seacherjob); Quartzmanager.addjob(job); }}} @Override public void changestatus(long jobid、string cmd)schoodulerexception {taskdo schedulejob = get(jobid); if(schedulejob == null){return; } if(constant.status_running_stop.equals(cmd)){quartzmanager.deletejob(schedulejobutils.entitytodata(seachedjob)); ScheduelJob.setJobstatus(scheduleJob.status_not_running); } else {if(!constant.status_running_start.equals(cmd)){} else {schedulejob.setjobstatus(schedulejob.status_running); Quartzmanager.addjob(schedulejobutils.entitytodata(schedulejob)); }} update(schedulejob); } @Override public void updatecron(long jobid)スロースケジュールエクセプション{taskdo schedulejob = get(jobid); if(schedulejob == null){return; } if(schedueljob.status_running.equals(schedueljob.getjobstatus())){quartzmanager.updatejobcron(schedulejobutils.entitytodata(seachedjob)); } update(schedulejob); }}リスナーを始めて、クォーツを初期化します
Import org.springframework.beans.factory.annotation.autowired; Import org.springframework.boot.commandlinerunner; Import org.springframework.core.annotation.order; Import org.springframework.tertype.componen com.bootdo.common.service.jobservice;@component@order(value = 1)public class schedulejobinitlistener commandlinerunner {@autowired jobservice schedulejobservice; @Autowired Quartzmanager Quartzmanager; @Override public void run(string ... arg0)スロー例外{try {schedueljobservice.initschedule(); } catch(Exception e){e.printstacktrace(); }}}上記はこの記事のすべての内容です。みんなの学習に役立つことを願っています。誰もがwulin.comをもっとサポートすることを願っています。