你的位置:首页 > Java教程

[Java教程]Quartz框架 实现任务调度


1.任务

Job:是一个接口,只有一个方法void execute(JobExecutionContext context),开发者实现该接口定义运行任务,JobExecutionContext类提供了调度上下文的各种信息。Job运行时的信息保存在 JobDataMap实例中;

2.触发器

Trigger:是一个类,描述触发Job执行的时间触发规则。主要有SimpleTrigger和 CronTrigger这两个子类。当仅需触发一次或者以固定时间间隔周期执行,SimpleTrigger是最适合的选择;而CronTrigger则 可以通过Cron表达式定义出各种复杂时间规则的调度方案:如每早晨9:00执行,周一、周三、周五下午5:00执行等;

3.调度器

JobDetail:Quartz在每次执行Job时,都重新创建一个Job实例,所以它不直接接受一个Job的实例,相反它接收一个Job实现类,以便运行时通过newInstance()的反射机制实例化Job。因此需要通过一个类来描述Job的实现类及其它相关的静态信息,如Job名字、描述、关联监听器等信息,JobDetail承担了这一角色。

创建一个Quartz工作

1.计划实体类

/****计划实体类*/public class Plan {  private String date;  private String task;  public Plan(String date, String task) {        this.date = date;    this.task = task;  }  public Plan() {      }  @Override  public String toString() {    return "Plan [date=" + date + ", task=" + task + "]";  }  public String getDate() {    return date;  }  public void setDate(String date) {    this.date = date;  }  public String getTask() {    return task;  }  public void setTask(String task) {    this.task = task;  }}

2.提醒服务类

/** * * @提醒服务类 * */public class RemindService {  //数据查询  public List<Plan> getPlansForToday(){    List<Plan> list=new ArrayList<Plan>();    Plan p1=new Plan("2016-11-3","呵呵");    Plan p2=new Plan("2016-11-4","嘿嘿");    list.add(p1);    list.add(p2);    return list;      }  //提醒服务类  public void ouputPlan(){    List<Plan> forToday = getPlansForToday();    for (Plan plan : forToday) {      System.out.println("计划时间"+plan.getDate()+"计划内容"+plan.getTask());    }  }}

3.提醒任务类

/** * * @提醒任务类 * */public class RemindJob implements Job {  private RemindService service=new RemindService();    public void execute(JobExecutionContext arg0) throws JobExecutionException {    service.getPlansForToday();      }  public RemindService getService() {    return service;  }  public void setService(RemindService service) {    this.service = service;  }}

4.调度定时器任务

public class TestJob {  public static void doRemind() throws SchedulerException, InterruptedException{    //创建一个任务    JobDetail job =JobBuilder.newJob(RemindJob.class).withIdentity("job1", "group1").build();    //创建一个触发器        /*Trigger trigger = TriggerBuilder.newTrigger()         .withIdentity(TriggerKey.triggerKey("myTrigger", "myTriggerGroup"))        .withSchedule(SimpleScheduleBuilder.simpleSchedule()          .withIntervalInMilliseconds(2))        .startAt(new Date(System.currentTimeMillis()+2000))        .build();*/    Trigger trigger=TriggerBuilder.newTrigger().withIdentity("myTrigger", "group1").        withSchedule(CronScheduleBuilder.cronSchedule("0 34 16 ? * 5#1 2016")).build();    SchedulerFactory s=new StdSchedulerFactory();    Scheduler scheduler = s.getScheduler();    //注册并进行调度    scheduler.scheduleJob(job,trigger);    //启动调度    scheduler.start();    //睡眠10s    //Thread.sleep(10000);    //关闭调度    //scheduler.shutdown();  }    public static void main(String[] args) throws SchedulerException, InterruptedException {      doRemind();    }}

Cron表达式