1.新增專案
2.加入相依Jar檔案
Gradle
|
//scheduling
compile 'org.springframework:spring-context-support:4.3.6.RELEASE'
// http://ift.tt/2oigF6L
compile group: 'org.quartz-scheduler', name: 'quartz', version: '2.2.3'
// http://ift.tt/2nCzttS
compile group: 'org.springframework', name: 'spring-tx', version: '4.3.6.RELEASE'
|
3.新增JOB和JOB DETAIL
JOB即為時間到時要執行之動作,以下藉由兩個JOB驗證排班情況
各別為每秒執行,以及每5秒執行。
org.iwlp.job.SecondlyJob
|
package org.iwlp.job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.scheduling.quartz.QuartzJobBean;
import org.springframework.stereotype.Component;
@Component
public class SecondlyJob extends QuartzJobBean{
private static final Logger log = LoggerFactory.getLogger(SecondlyJob.class);
/* (non-Javadoc)
* @see org.springframework.scheduling.quartz.QuartzJobBean#executeInternal(org.quartz.JobExecutionContext)
*/
@Override
protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
// TODO Auto-generated method stub
log.debug("1sec RUN");
}
}
|
org.iwlp.job.detail.SecondlyJobDetail
|
package org.iwlp.job.detail;
import org.iwlp.job.SecondlyJob;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.scheduling.quartz.JobDetailFactoryBean;
import org.springframework.stereotype.Component;
@Component
public class SecondlyJobDetail extends JobDetailFactoryBean{
private static final Logger log = LoggerFactory.getLogger(SecondlyJobDetail.class);
@Override
public void afterPropertiesSet() {
setJobClass(SecondlyJob.class);
setDurability(true);
setName("secondJobClass");
super.afterPropertiesSet();
}
}
|
org.iwlp.job.FiveSecondJob
|
package org.iwlp.job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.scheduling.quartz.QuartzJobBean;
import org.springframework.stereotype.Component;
@Component
public class FiveSecondJob extends QuartzJobBean{
private static final Logger log = LoggerFactory.getLogger(FiveSecondJob.class);
/* (non-Javadoc)
* @see org.springframework.scheduling.quartz.QuartzJobBean#executeInternal(org.quartz.JobExecutionContext)
*/
@Override
protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
// TODO Auto-generated method stub
log.debug("5sec RUN");
}
}
|
org.iwlp.job.detail.FiveSecondJobDetail
|
package org.iwlp.job.detail;
import org.iwlp.job.FiveSecondJob;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.scheduling.quartz.JobDetailFactoryBean;
import org.springframework.stereotype.Component;
@Component
public class FiveSecondJobDetail extends JobDetailFactoryBean{
private static final Logger log = LoggerFactory.getLogger(FiveSecondJobDetail.class);
@Override
public void afterPropertiesSet() {
setJobClass(FiveSecondJob.class);
setDurability(true);
setName("fiveJobClass");
super.afterPropertiesSet();
}
}
|
4.TIGGER
Tigger是設定Job何時啟動,以下以Crontab (setCronExpressio) 格式做示範案例
也可用線上工具產生Crontab語法,CronMark:http://ift.tt/19UHFqs
Crontab說明: second(0-59) minute(0-59) hour(0-23) day-of-month(1-31) month(1-12) day-of-week(1~7 或SUN~SAT) year(2009,2012,2013)
更完整說明請參閱:http://ift.tt/2nCPWyw
org.iwlp.job.tigger.SecondlyTigger
|
package org.iwlp.job.tigger;
import java.text.ParseException;
import org.iwlp.job.detail.SecondlyJobDetail;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.quartz.CronTriggerFactoryBean;
import org.springframework.stereotype.Component;
@Component
public class SecondlyTigger extends CronTriggerFactoryBean{
@Autowired
private SecondlyJobDetail secondlyJobDetail;
@Override
public void afterPropertiesSet() throws ParseException {
setCronExpression("0/1 * * * * ?");
setJobDetail(secondlyJobDetail.getObject());
super.afterPropertiesSet();
}
}
|
org.iwlp.job.tigger.FiveSecondTigger
|
package org.iwlp.job.tigger;
import java.text.ParseException;
import org.iwlp.job.detail.FiveSecondJobDetail;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.quartz.CronTriggerFactoryBean;
import org.springframework.stereotype.Component;
@Component
public class FiveSecondTigger extends CronTriggerFactoryBean{
@Autowired
private FiveSecondJobDetail fiveSecondJobDetail;
@Override
public void afterPropertiesSet() throws ParseException {
setCronExpression("0/5 * * * * ?");
setJobDetail(fiveSecondJobDetail.getObject());
super.afterPropertiesSet();
}
}
|
5.SCHEDULER FACTORY
透過Scheduler Factory把上述之Job, tigger加入系統中
org.iwlp.config.ActionSchedulerFactoryBean
|
package org.iwlp.config;
import java.util.ArrayList;
import java.util.List;
import org.iwlp.job.detail.FiveSecondJobDetail;
import org.iwlp.job.detail.SecondlyJobDetail;
import org.iwlp.job.tigger.FiveSecondTigger;
import org.iwlp.job.tigger.SecondlyTigger;
import org.quartz.JobDetail;
import org.quartz.Trigger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.quartz.SchedulerFactoryBean;
import org.springframework.stereotype.Component;
@Component
public class ActionSchedulerFactoryBean extends SchedulerFactoryBean{
@Autowired
private SecondlyJobDetail secondlyJobDetail;
@Autowired
private SecondlyTigger secondlyTigger;
@Autowired
private FiveSecondJobDetail secondJobDetail;
@Autowired
private FiveSecondTigger secondTigger;
@Override
public void afterPropertiesSet() throws Exception {
List<JobDetail> jobDetails = new ArrayList<JobDetail>();
jobDetails.add(secondlyJobDetail.getObject());
jobDetails.add(secondJobDetail.getObject());
List<Trigger> triggers = new ArrayList<Trigger>();
triggers.add(secondlyTigger.getObject());
triggers.add(secondTigger.getObject());
JobDetail[] jobDetailArray = new JobDetail[jobDetails.size()];
jobDetails.toArray(jobDetailArray);
Trigger[] triggerArray = new Trigger[triggers.size()];
triggers.toArray(triggerArray);
setJobDetails(jobDetailArray);
setTriggers(triggerArray);
super.afterPropertiesSet();
}
}
|
6.檢視結果
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v1.5.2.RELEASE)
10:07:14.039 [main] INFO o.i.c.ActionSchedulerFactoryBean.startScheduler [647] - Starting Quartz Scheduler now
10:07:14.048 [actionSchedulerFactoryBean_Worker-1] DEBUG org.iwlp.job.SecondlyJob.executeInternal [35] - 1sec RUN
10:07:14.048 [actionSchedulerFactoryBean_Worker-2] DEBUG org.iwlp.job.SecondlyJob.executeInternal [35] - 1sec RUN
10:07:15.002 [actionSchedulerFactoryBean_Worker-3] DEBUG org.iwlp.job.FiveSecondJob.executeInternal [35] - 5sec RUN
10:07:15.003 [actionSchedulerFactoryBean_Worker-4] DEBUG org.iwlp.job.SecondlyJob.executeInternal [35] - 1sec RUN
|
7.下載專案
https://drive.google.com/open?id=0B1csp1uQbCtjb0ZmN2VndHZNSWc
Tags: Quartz, Spring Boot, IFTTT-SYNC
March 21, 2017 at 09:24AM
Open in Evernote