Quartz (三) Trigger

本文介绍了如何使用Quartz调度器的SimpleSchedule和CronSchedule触发器来安排任务执行。通过示例代码展示了如何设定任务的启动时间及重复频率,并详细解释了Cron表达式的含义。

简述:

这里研究一下Quartz调度工具,Trigger的使用

主要是用simpleschedule 和 cronschedule


参考

http://www.quartz-scheduler.org/documentation/quartz-2.2.x/tutorials/tutorial-lesson-04

http://www.quartz-scheduler.org/documentation/quartz-2.2.x/tutorials/tutorial-lesson-05

http://www.quartz-scheduler.org/documentation/quartz-2.2.x/tutorials/tutorial-lesson-06


1. simpleSchedule

设置启动时间,之后每五秒输出一次

TestQuartz.java

package com.anialy.tq;

import static org.quartz.DateBuilder.dateOf;
import static org.quartz.JobBuilder.newJob;
import static org.quartz.SimpleScheduleBuilder.simpleSchedule;
import static org.quartz.TriggerBuilder.newTrigger;

import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.Trigger;
import org.quartz.impl.StdSchedulerFactory;

public class TestQuartz {
    
	private static Scheduler scheduler;
    public static void main(String[] args) {

        try {
        	// Grab the Scheduler instance from the Factory 
        	scheduler = StdSchedulerFactory.getDefaultScheduler();

        	// Set Scheduler
        	setScheduler();

        	// and start it off
            scheduler.start();

            //shutdown to see the output of TestJob
//            scheduler.shutdown();  

        } catch (SchedulerException se) {
            se.printStackTrace();
        }
    }
    
    
    private static void setScheduler(){
        // define the job and tie it to our HelloJob class
        JobDetail job = newJob(TestJob.class)
            .withIdentity("job1", "group1")
            .build();
        
        // Trigger the job with interval 5 seconds
        Trigger trigger1 = newTrigger()
        		.withIdentity("trigger2", "group1")
        		.startAt(dateOf(22, 03, 59))  //start time 22:03:59
//        		.endAt(dateOf(22, 04, 59)) //end time 22:04:59
        		.withSchedule(simpleSchedule()
        				.withIntervalInSeconds(5)  
        				.repeatForever())
        				.build();

        // Tell quartz to schedule the job using our trigger
        try {
			scheduler.scheduleJob(job, trigger1);
		} catch (SchedulerException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
    }
}



TestJob.java 输出的任务

package com.anialy.tq;

import java.text.SimpleDateFormat;
import java.util.Date;

import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;

public class TestJob implements Job {
	private static int cnt = 0;
	
    public TestJob() {
        // Instances of Job must have a public no-argument constructor.
    }
	
	@Override
	public void execute(JobExecutionContext arg0) throws JobExecutionException {
		// TODO Auto-generated method stub
		System.out.println("TestJob " + (++cnt) + " Run! ");
		System.out.println("Current Time:  " 
		  + new SimpleDateFormat("yyyy:MM:dd HH:mm:ss").format(new Date()));
	}
}

输出:




2. cronSchedule

或者使用cronschedule实现任务Trigger配置,注意在cronschedule之中比如8月1号已设置,但是周几是不固定的 那就用“?”在周几的位置占位

package com.anialy.tq;

import static org.quartz.DateBuilder.dateOf;
import static org.quartz.JobBuilder.newJob;
import static org.quartz.SimpleScheduleBuilder.simpleSchedule;
import static org.quartz.TriggerBuilder.newTrigger;

import org.quartz.Calendar;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.Trigger;
import org.quartz.impl.StdSchedulerFactory;
import static org.quartz.TriggerBuilder.*;
import static org.quartz.CronScheduleBuilder.*;
import static org.quartz.DateBuilder.*;

public class TestQuartz {
    
	private static Scheduler scheduler;
    public static void main(String[] args) {

        try {
        	// Grab the Scheduler instance from the Factory 
        	scheduler = StdSchedulerFactory.getDefaultScheduler();

        	// Set Scheduler
        	setScheduler();

        	// and start it off
            scheduler.start();

            //shutdown to see the output of TestJob
//            scheduler.shutdown();  

        } catch (SchedulerException se) {
            se.printStackTrace();
        }
    }
    
    
    private static void setScheduler(){
    	
        // define the job and tie it to our HelloJob class
        JobDetail job = newJob(TestJob.class)
            .withIdentity("job1", "group1")
            .build();
        
        /**
         * DayOfMonth : 1-31
         * Month : JAN, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV and DEC
         * DayOfWeek : 1 and 7 (1 = Sunday) or SUN, MON, TUE, WED, THU, FRI and SAT
         *             or use MON-FRI to declare weekdays
         */
        Trigger trigger1 = newTrigger()
        		.withIdentity("trigger2", "group1")
        		//Aug 1st 10pm - 11pm every 1 minute
        		.withSchedule(cronSchedule("0 0/1 22-23 1 Aug ?")) 
//        		//10pm - 11pm every 1 minute on every Thursday and Friday in August
//        		.withSchedule(cronSchedule("0 0/1 22-23 ? Aug Thu,Friday")) 
        				.build();

        // Tell quartz to schedule the job using our trigger
        try {
			scheduler.scheduleJob(job, trigger1);
		} catch (SchedulerException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
    }
}

附,基本的正则表达式含义

(1)

"0/10 15/1 23-00 1 Aug ?"
表示从8月1号,23:15:00到00::00:00 截止开始每隔10秒执行一次


(2)

"0 0/1 22-23 ? AUG THU,FRI"
表示八月份的周四、周五每天晚上从22:42:00到23::00:00 截止,每分钟执行一次









评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值