Quartz scheduler 简介

Quartz scheduler是一款优秀的Java调度器,开发人员可以很容易的将需调度的任务(task)加入调度器(scheduler)中调度运行。

如何将task加入调度器,我们首先介绍几个概念:

  1. Scheduler Task – 纯Java类,就是开发人员需要调度的任务。
  2. Scheduler Job – 通过JobDetail获得执行任务的详细信息,定义执行方式。类似于执行模板,核心方法是execute()。
  3. Scheduler JobDetail – JobDetail负责存储要调度job的详细信息,task相关数据,包括任务名,任务相关数据等。
  4. Trigger – 触发器定义任务触发时机。
  5. Scheduler – 将任务和触发器连接在一起,调用任务执行。

下面通过一个例子讲解Quartz如何工作。

首先,我们定义具体执行的任务。

package quartz.test;
 
public class RunMeTask
{
    public void printMe() {
        System.out.println("Run Me ~");
    }
}


定义Job,本例中RunMeJob通过JobDataMap获得了需要执行的task实例,运行相应的方法。


package quartz.test;
 
import java.util.Map;
 
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
 
public class RunMeJob implements Job
{
    public void execute(JobExecutionContext context)
    throws JobExecutionException {
 
        Map dataMap = context.getJobDetail().getJobDataMap();
        RunMeTask task = (RunMeTask)dataMap.get("runMeTask");
        task.printMe();
    }
}

定义JobDetail,将RunMeTask实例添加到JobDetail的JobDataMap中

       

RunMeTask task = new RunMeTask();
 
        //specify your sceduler task details
        JobDetail job = new JobDetail();
        job.setName("runMeJob");
        job.setJobClass(RunMeJob.class);
 
        Map dataMap = job.getJobDataMap();
        dataMap.put("runMeTask", task);


触发器,Quartz有两种触发器:

  • SimpleTrigger – 允许设定开始时间、结束时间、重复间隔等。
  • CronTrigger – 使用 Unix cron expression 指定运行Job的时机。

SimpleTrigger trigger = new SimpleTrigger();
trigger.setName("runMeJobTesting");
trigger.setStartTime(new Date(System.currentTimeMillis() + 1000));
trigger.setRepeatCount(SimpleTrigger.REPEAT_INDEFINITELY);
trigger.setRepeatInterval(30000);

 

//configure the scheduler time
        CronTrigger trigger = new CronTrigger();
        trigger.setName("runMeJobTesting");
        trigger.setCronExpression("0/30 * * * * ?");

调度器,把trigger和JobDetail连接在一起进行调度。

 //schedule it
        Scheduler scheduler = new StdSchedulerFactory().getScheduler();
        scheduler.start();
        scheduler.scheduleJob(job, trigger);

完整实例

Simple trigger

package quartz.test;
 
import java.util.Date;
import java.util.Map;
 
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SimpleTrigger;
import org.quartz.impl.StdSchedulerFactory;
 
public class QuartzAppSimpleTrigger
{
    public static void main( String[] args ) throws Exception
    {
        RunMeTask task = new RunMeTask();
 
        //specify your sceduler task details
        JobDetail job = new JobDetail();
        job.setName("runMeJob");
        job.setJobClass(RunMeJob.class);
 
        Map dataMap = job.getJobDataMap();
        dataMap.put("runMeTask", task);
 
        //configure the scheduler time
        SimpleTrigger trigger = new SimpleTrigger();
        trigger.setName("runMeJobTesting");
        trigger.setStartTime(new Date(System.currentTimeMillis() + 1000));
        trigger.setRepeatCount(SimpleTrigger.REPEAT_INDEFINITELY);
        trigger.setRepeatInterval(30000);
 
        //schedule it
        Scheduler scheduler = new StdSchedulerFactory().getScheduler();
        scheduler.start();
        scheduler.scheduleJob(job, trigger);
 
    }
}

CronTrigger

package quartz.test;
 
import java.util.Map;
 
import org.quartz.CronTrigger;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.impl.StdSchedulerFactory;
 
public class QuartzAppCronTrigger
{
    public static void main( String[] args ) throws Exception
    {
        RunMeTask task = new RunMeTask();
 
        //specify your sceduler task details
        JobDetail job = new JobDetail();
        job.setName("runMeJob");
        job.setJobClass(RunMeJob.class);
 
        Map dataMap = job.getJobDataMap();
        dataMap.put("runMeTask", task);
 
        //configure the scheduler time
        CronTrigger trigger = new CronTrigger();
        trigger.setName("runMeJobTesting");
        trigger.setCronExpression("0/30 * * * * ?");
 
        //schedule it
        Scheduler scheduler = new StdSchedulerFactory().getScheduler();
        scheduler.start();
        scheduler.scheduleJob(job, trigger);
    }
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值