스프링 프레임 워크에서 타이밍 작업은 @Schedule을 통해 구현할 수 있습니다. CRON의 속성 설명에 의해 설명 된 규칙을 통해 Spring 은이 방법을 호출합니다.
Spring은 타이밍 작업을 간단하고 대략 구현했는데 왜 석영을 사용합니까?
현재 시간이 많이 걸린 작업이있는 경우 규칙이 다릅니다.
Maven 의존성
<pectionency> <groupid> org.quartz-scheduler </groupid> <artifactid> quartz </artifactid> <bersion> 2.2.1 </version> </dependency> <groupid> org.quartz-scheduler </groupid> <artifactid> qupactz-jobs </artifactid> </version> 2.1 </version> 2.1 </version>.
다음은 Bootdo 오픈 소스 학습 프레임 워크의 소스 코드입니다.
나는 모든 필드를 사용하지 않았으며 아이디어는 먼저 DB를 쿼리하는 것입니다.
다음 두 객체를 캡슐화하십시오
트리거 조건이 충족되면 클래스는 세트 BeanClass (org.quartz.job을 구현해야 함)를 기준으로 발견됩니다. 이때 JobDetail의 데이터를 검색하고 특정 비즈니스 로직을 실행할 수 있습니다.
@ComponentPublic 클래스 WelcomeJob 구현 작업 {@override public void execute (jobExecutionContext Arg0) jobExecutionException {// 비즈니스 로직}}테이블 구조
테이블 생성`sys_task` (`id` bigint (20)는 null auto_increment,`cronexpression` varchar (255) 기본 널 댓글 'cron 표현',`methodname` varchar (255) default null 댓글 '의 기본 null 댓글', 작업 통화의 메소드 이름 ',`isconcurrent'varch (255)의 var 댓글 '(255)', 255 ' 기본 널 댓글 '작업 설명',`updateBy` varchar (64) 기본 널 댓글 'updator',`beanclass` varchar (255) 기본 NULL 주석 '작업이 실행될 때 클래스가 호출되는 기본 NULL 주석',`DateTime 기본값 NULL NULL NULL NULL 주석 'TIME CREATE',`JOBSTATUS 'VARCHAR (255) DEPALT NULL'TASK (255), '255'TASK 'TASTIC'TASK 'STAST' ' 댓글 '작업 그룹화',`DateTime 기본 널 댓글 '업데이트 시간', 'CreateBy` Varchar (64) 기본 널 댓글'제작자 ',`SpringBean` Varchar (255) 기본 NULL 주석'스프링 빈 ',``jobname'varchar (255) 기본 NULL 주석 '작업 이름') ENGING ') ENGING') ENGING ') charset = utf8 row_format = compact;
구성 클래스
import java.io.ioexception; import java.util.properties; import org.quartz.scheduler; import org.springframework.beans.beans.annotation.autowired; import org.springframework.beans.config.propertiesfactorybean; import org.spramframwork.context org.springframework.context.annotation.configuration; import org.springframework.core.io.classpathresource; import org.springframework.scheduling.quartz.schederfactorybean; import com.txgl.common.quartz.jorgightoration; {@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 () 던지기 IoException {propertiesFactiforyBean factiesFactireBean = new PropertiesFactoryBean (); propertiesfictoryBean.setLocation (new ClassPathResource ( "/config/Quartz.properties")); propertiesfictoryBean.afterProperTiesset (); return propertiesfictoryBean.getObject (); } // 스케줄 생성 @bean (name = "scheduler") public scheduler scheduler () {return schedulerfactorybean (). getScheduler (); }}QuartzManager의 코드는 스케줄러를 주입하여 작업에서 작동하는 열쇠입니다.
import java.util.arraylist; import java.util.list; import java.util.set; import org.apache.log4j.logger; import org.quartz.cronschedulebuilder; import org.quartz.quartz.crontrigger; import org.quartz.datebuilder; import org.datevunit 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.schedulerexception; import org org.quartz.triggerbuilder; import org.quartz.triggerkey; import org.quartz.impl.matchers.groupmatcher; import org.springframework.beans.beans.annotation.autowirect; import org.springframework.beans.beans.annotation.qualifier; 수입 org.springframework.scheduling.quartz.schedulerfactorybean; import org.springframework.stereotype.service; import org.springframework.web.context.support.springbeanautowiringsupport; import com.bootdo.common.domain.schedjob; com.bootdo.common.quartz.factory. *; import com.bootdo.common.utils.springcontexTholder ;;/** * * * * * * * * * * * * * * * * * * * * * * * * * * * */ @ServicePublic Class QuartzManager {public final logger logger. // private schedulerFactoryBean schedulerFactoryBean // = SpringContexTholder.getBean (schedulerFactoryBean.class); // @autowired // @qualifier ( "schedulerfactorybean") // private schedulerfactorybean schedulerfactorybean; @autowired 개인 스케줄러 스케줄러; / ** * 작업 추가 * * @param schedulejob * @throws schedulerexception */ public void addjob (schedulejob job) {try {// jobDetail 인스턴스 생성, 작업 구현 클래스를 바인딩하고 작업 이름, 그룹 이름을 지정하고 구직 클래스 클래스 <? job> jobclass = (class <? extends job>) (class.forname (job.getBeanClass ()). newInstance () .getClass ()); jobDetail jobDetail = jobBuilder.newJob (jobClass) .witHeidentity (job.getJobName (), job.getJobGroup ()) // 작업 이름 및 그룹 양식 작업 키 .Build (); // 디스패치 트리거 규칙 정의 // Corntrigger Rule Trigger Trigger = TriggerBuilder.newtrigger (). withidentity (job.getJobName (), job.getJobGroup ()) // 트리거 키 .Startat (dateBuilder.Futuredate (1, intervalunit.second)) .withSchedule (cronscheduleBuilder.cronsChedule (job.getCroneXpression ()). startNow (). build (); // 작업 스케줄러에 작업을 등록하고 트리거를 등록합니다 .Schedulejob (jobDetail, Trigger); // start if (! scheduler.isshutdown ()) {scheduler.start (); }} catch (예외 e) {e.printstacktrace (); }} // public void addjob (schedulejob job)는 schedulerexception {// if (job == null ||! schedulejob.status_running.equals (job.getJobstatus ()) {// return; //} /// triggerkey triggerkey = 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) .withidentity (job.getJobName (), job.getJobGroup ()). 빌드 (); ////////////////////////////////////////////////////////////c. jobDetail.getJobdatamap (). put ( "schedulejob", job); /// cronscheduleBuilder ScheduleBuilder = cronscheduleBuilder.cronschedule (job.getCroneXpression ()); /// trigger = triggerBuilder.newtrigger (). job.getJobGroup ()) // .withSchedule (schedulebuilder) .build (); /// Scheduler.schedulejob (jobDetail, trigger); //} else {// // 트리거가 이미 존재하는 다음 해당 타이밍 설정 /// cronschedbuilder = cronschedulebuilder.cronschedule (job.getCronexpression ()); //// // 새로운 cronexpression expression ////////trigger = trigger.gettriggerBuilder ()에 따라 트리거 트리거 (triggerkey). scheduler.reschedulejob (triggerkey, trigger); //} //}/ ** * 예정된 모든 작업 목록을 가져옵니다 * * @return * @throws schedulerexception */ public list <schedulejob> getAllJob () schedulerexception {groupMatcher <WorkKey> matcher = groupmatcher.anojobgroup (); <wackkey> wabkeys = scheduler.getJobkeys (매치사)를 세트; List <schedulejob> joblist = new arraylist <schedulejob> (); for (The Workkey Tobkey : Workkeys) {list <? trigger> triggers = scheduler.gettriggersofjob (wabkey); for (트리거 트리거 : 트리거) {schedulejob job = new ScheduleJob (); job.setJobName (wabkey.getName ()); job.setJobGroup (waby.getGroup ()); job.setDescription ( "트리거 :" + trigger.getKey ()); trigger.triggerstate triggerstate = scheduler.gettriggerstate (trigger.getKey ()); job.setjobstatus (triggerstate.name ()); if (crontrigger의 트리거 인스턴스) {crontrigger crontrigger = (crontrigger) 트리거; 문자열 cronexpression = crontrigger.getCroneXpression (); job.setcronexpression (cronexpression); } joblist.add (job); }} return joblist; } / ** * 모든 실행되는 작업 * * @return * @throws schedulerexception * / public list <schedulejob> getRunningJob () 던지기 schedulerexception {list <jobExecutionContext> executeJobs = scheduler.getCurrelyEctingJobs (); List <SchedlayJob> joblist = new ArrayList <SchedureJob> (ExecutingJobs.Size ()); for (jobExecutionContext executionJob : executionJobs) {schedulejob job = new ScheduleJob (); jobDetail jobDetail = executionJob.getJobDetail (); Tobkey Wabkey = jobDetail.getKey (); 트리거 트리거 = executionJob.getTrigger (); job.setJobName (wabkey.getName ()); job.setJobGroup (waby.getGroup ()); job.setDescription ( "트리거 :" + trigger.getKey ()); trigger.triggerstate triggerstate = scheduler.gettriggerstate (trigger.getKey ()); job.setjobstatus (triggerstate.name ()); if (crontrigger의 트리거 인스턴스) {crontrigger crontrigger = (crontrigger) 트리거; 문자열 cronexpression = crontrigger.getCroneXpression (); job.setcronexpression (cronexpression); } joblist.add (job); } return joblist; } / ** * 작업 중지 * * @param schedulejob * @throws schedulerexception * / public voidejob (scheturejob schedulejob) throws schedulerexception {jobkey jobkey = jobkey.jobkey (schedulejob.getJobname (), schedulejob.getjobgroup ()); Scheduler.PauseJob (WARKKEY); } / ** * 작업 복원 * * @param schedulejob * @throws schedulerexception * / public void recumejob (scheturejob schedulejob) 던지기 schedulerexception {tobkey jobkey = jobkey.jobkey (schedulejob.getJobname (), schedulejob.getjobgroup ()); Scheduler.resumejob (Waby); } / ** * 작업 삭제 * * @param schedulejob * @throws schedulerexception * / public void deletejob (schedulejob schedulejob) 던지기 schedulerexception {tobkey jobkey = jobkey.jobkey (schedulejob.getJobname (), schedulejob.getJobgroup ()); Scheduler.deletejob (Waby); } / ** * 즉시 작업을 즉시 실행 * * @param schedulejob * @throws schedulerexception * / public void runajobnow (schedulejob schedulejob) 던지기 schedulerexception {tobkey jobkey = jobkey.jobkey (schedulejob.getJob.getJob.getJobgroup ()); Scheduler.triggerJob (WABKEY); } / ** * 작업 시간 표현 업데이트 * * @param schedulejob * @throws schedulerexception * / public void updatejobcron (schedulejob schedulejob) 던지기 schedulerexception {triggerkey triggerkey = triggerkey.triggkey (schedulejob.getJobname (), schedulejob.getJobgroup ()); crontrigger trigger = (crontrigger) scheduler.gettrigger (triggerkey); CronscheduleBuilder ScheduleBuilder = CronscheduleBuilder.cronschedule (schedulejob.getCroneXpression ()); trigger = trigger.gettriggerBuilder (). Withidentity (triggerkey) .withSchedule (schedulebuilder) .build (); Scheduler.reschedulejob (트리거 키, 트리거); }}서비스 구현
import com.bootdo.common.config.constant; import com.bootdo.common.dao.taskdao; import com.bootdo.common.common.schedulejob; import com.bootdo.common.domain.taskdo; import com.bootdo.common.quartz.utils.quartzmanager; com.bootdo.common.service.jobservice; import com.bootdo.common.utils.schedulejobutils; import org.quartz.schedulerexception; import org.springframework.beans.beans.annotation.autowed; import org.springframework.stereotyp.service; java.util.list; import java.util.map; @servicepublic 클래스 JobServiceImpl 구현 jobService {@autowired private taskdao taskschedulejobmapper; @autowired Quartzmanager Quartzmanager; @override public taskdo get (long id) {return taskschedulejobmapper.get (id); } @override public list <aitddo> list (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 (ScheduleJobutils.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 (ScheduleJobutils.entityTodata (schedulejob)); } catch (schedulerexception e) {e.printstacktrace (); 반환 0; }} return taskschedulejobmapper.batchremove (ids); } @Override public void initSchedule ()는 schedulerexception {// 작업 정보 데이터를 가져옵니다. 여기에 <aitddo> joblist = taskschedulejobmapper.list (new Hashmap <String, Object> (16)); for (taskdo schedulejob : joblist) {if ( "1".equals (schedulejob.getjobstatus ())) {schedulejob job = schedulejobutils.entityTodata (schedulejob); Quartzmanager.addjob (직업); }}} @override public void changestatus (long jobid, string cmd)는 schedulerexception {taskdo schedulejob = get (jobid); if (schedulejob == null) {return; } if (constant.status_running_stop.equals (cmd)) {quartzmanager.deletejob (schedulejobutils.entityTodata (schedulejob)); schedulejob.setjobstatus (schedulejob.status_not_running); } else {if (! constant.status_running_start.equals (cmd)) {} else {schedulejob.setjobstatus (schedulejob.status_running); Quartzmanager.addjob (ScheduleJobutils.entityTodata (schedulejob)); }} 업데이트 (ScheduleJob); } @override public void updatecron (long jobid) 던지기 schedulerexception {taskdo schedulejob = get (jobid); if (schedulejob == null) {return; } if (schedulejob.status_running.equals (schedulejob.getJobstatus ())) {QuartzManager.updateJobcron (schetarejobutils.entityTodata (schetarejob)); } update (ScheduleJob); }}Quartz를 초기화하기 위해 리스너를 시작하십시오
import org.springframework.bean.beans.annotation.autowired; import org.springframework.cormandlinerunner; import org.spramframework.core.annotation.order; import org.springframework.steretype.component; import com.bootdo.common.util.util. com.bootdo.common.service.jobservice;@component@order (value = 1) 공개 클래스 schedulejobinitlistener emperments CommandLinerUnner {@autowired jobservice schedulejobservice; @autowired Quartzmanager Quartzmanager; @override public void run (string ... arg0)은 예외 {try {schedulejobservice.initschedule (); } catch (예외 e) {e.printstacktrace (); }}}위는이 기사의 모든 내용입니다. 모든 사람의 학습에 도움이되기를 바랍니다. 모든 사람이 wulin.com을 더 지원하기를 바랍니다.