quartz的使用以及web應用的任務排程
阿新 • • 發佈:2019-01-05
在工作中不可避免會遇到任務排程的場景,無論是積分統計,生成報表,使用者管理等都需要在某個時間節點進行相應的業務操作,而JDK中的Time和TimerTask適用場景偏向於持續時間短,簡單重複的操作。因此針對時間跨度長,自定義時間觸發的排程場景,更適合適用Quartz框架。以下便是Quartz的入門講解以及使用:
Quartz基礎結構:
1. Job:是一個只有voidexecute(JobExecutionContext context)方法的介面,開發者通過實現介面,在方法中定義需要完成的任務,context提供排程上下文的資訊。
2. JobDetail:接收一個Job實現類,通過反射機制例項化Job。且每次執行Job,都會重新建立一個Job例項。因此這個類用於描述Job實現類和其他靜態資訊,以便例項化操作。
3. Trigger:代表觸發Job執行的規則。主要有SimpleTrigger和CronTrigger兩個子類。
4. Calendar:代表日期集合,可以與Trigger關聯,以便在常規規則中取出某些特殊時間點。
5. Scheduler:Quartz的獨立執行容器,JobDetail和Trigger註冊到Scheduler內,以實現Trigger和Job的關聯。Trigger和Jobdetai各自的名稱和組名的組合是Scheduler的唯一標示,因此必須唯一(但是對於一個Trigger和一個Jobdetail,名稱和組名不相關,因為在不同的集合內)一個Job可以對應多個Trigger而一個Trigger只能對應一個Job。
Job例項:
配置Scheduler:public class DealDataJob implements Job{ private static final Logger log = Logger.getLogger(DealDataJob.class); @Override public void execute(JobExecutionContext context) throws JobExecutionException { log.info("--------------"); log.info("預處理資料..."); RecordDao recordDao = new RecordDao(); recordDao.preDealData(); recordDao = null; log.info(new Date()); log.info("處理資料結束"); log.info("--------------"); } }
public class QuartzManage {
private static final Logger log = Logger.getLogger(QuartzManage.class);
private static final String JOB_NAME = "deal_data";
private static final String GROUP_NAME = "group";
private static final String TRIGGER_NAME = "daily";
public static void manageJob() {
try {
JobDetail jobDetail = configJobDetail();
CronTrigger cronTrigger = configTrigger();
Scheduler scheduler = configScheduler(jobDetail, cronTrigger);
scheduler.start();
} catch (Exception e) {
e.printStackTrace();
log.info("manage failed");
log.error(e.getMessage());
}
}
/**
* 配置JobDetail
* @return
*/
private static JobDetail configJobDetail(){
JobDetailImpl jobDetail = new JobDetailImpl();
jobDetail.setName(JOB_NAME);
jobDetail.setGroup(GROUP_NAME);
jobDetail.setJobClass(DealDataJob.class);
return jobDetail;
}
/**
* 配置排程時間點Trigger
* @return
* @throws ParseException
*/
private static CronTrigger configTrigger() throws ParseException{
CronTriggerImpl cronTrigger = new CronTriggerImpl();
cronTrigger.setName(TRIGGER_NAME);
cronTrigger.setGroup(GROUP_NAME);
CronExpression expression = new CronExpression("0 0 6 * * ? *"); //每天早上六點觸發操作
cronTrigger.setCronExpression(expression);
return cronTrigger;
}
/**
* 配置執行容器,並將工作和排程時間註冊到執行容器中
* @param jobDetail
* @param trigger
* @return
* @throws SchedulerException
*/
private static Scheduler configScheduler(JobDetail jobDetail,Trigger trigger)
throws SchedulerException{
SchedulerFactory schedulerFactory = new StdSchedulerFactory();
Scheduler scheduler = schedulerFactory.getScheduler();
scheduler.scheduleJob(jobDetail, trigger);
return scheduler;
}
public static void main(String[]args){
manageJob();
}
在Web應用中,只需要定義一個Listener,配置到web.xml中。呼叫Quartz即可完成任務排程:
public class ContextListener implements ServletContextListener{
@Override
public void contextDestroyed(ServletContextEvent sce) {
// TODO Auto-generated method stub
System.out.println("context destroyed");
}
@Override
public void contextInitialized(ServletContextEvent sce) {
// TODO Auto-generated method stub
System.out.println("context initialized");
QuartzManage.manageJob();
}
}
web.xml
<listener>
<listener-class>
com.bydota.product.listener.ContextListener
</listener-class>
</listener>