作业调度---quartz

  作业调度是现代系统中对 Java 应用程序的一般要求,而且也是对 Java 开发人员一贯的要求。
  作业调度最合适的解决方案就是来自 OpenSymphonyQuartz API

  Quartz 允许开发人员根据时间间隔(或天)来调度作业,Quartz将作业和触发器分开,这样可以方便二者的自由组合,形成多对多的关系。其中作业,是指能够调度执行的任务,而触发器是指对作业的调度,包括对时间的安排等。

   Quartz的HelloWord: 

   1.环境:quartz-1.6.6 过程中需引入 quartz-1.6.6.jar和 commons-logging-1.1.jar(在下下来的官方包中有,后者在lib/core包中)

   2.作业的编写 implements Job

import java.util.Date;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;


public class HelloJob implements Job {

    private static Log _log = LogFactory.getLog(HelloJob.class);

    public HelloJob() {
    }
    
    public void execute(JobExecutionContext context)
        throws JobExecutionException {

        // Say Hello to the World and display the date/time
        _log.info("Hello World! - " + new Date());
    }

}

    解释:在 execute 方法接受一个 JobExecutionContext 对象作为参数。这个对象提供了作业实例的运行时上下文

 

 

 

    2.触发器的编写 

 

package example1;

import java.util.Date;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerFactory;
import org.quartz.SimpleTrigger;
import org.quartz.TriggerUtils;
import org.quartz.impl.StdSchedulerFactory;


/**
 * 
 * 作业调度理解:
 * 1.初始化: 从调度工厂中取出调度器
 * 2.调度作业:创建作业和触发器,并装配在一起
 * 3.启动
 * 4.关闭
 */
public class SimpleExample {

    
    public void run() throws Exception {
        Log log = LogFactory.getLog(SimpleExample.class);

        log.info("------- Initializing ----------------------");

        SchedulerFactory sf = new StdSchedulerFactory();
        Scheduler sched = sf.getScheduler();

        log.info("------- Initialization Complete -----------");

        log.info("------- Scheduling Jobs -------------------");

        // computer a time that is on the next round minute
        Date runTime = TriggerUtils.getEvenMinuteDate(new Date());

        // define the job and tie it to our HelloJob class
        JobDetail job = new JobDetail("job1", "group1", HelloJob.class);
        
        // Trigger the job to run on the next round minute
        SimpleTrigger trigger = 
            new SimpleTrigger("trigger1", "group1", runTime);
        
        // Tell quartz to schedule the job using our trigger
        sched.scheduleJob(job, trigger);
        log.info(job.getFullName() + " will run at: " + runTime); 
        
        log.info("------- Started Scheduler -----------------");
        sched.start();
        
        log.info("------- Waiting 90 seconds... -------------");
        try {
            // wait 90 seconds to show jobs
            Thread.sleep(90L * 1000L); 
        } catch (Exception e) {
        }

        log.info("------- Shutting Down ---------------------");
        sched.shutdown(true);
        log.info("------- Shutdown Complete -----------------");
    }

    public static void main(String[] args) throws Exception {

        SimpleExample example = new SimpleExample();
        example.run();

    }

}
 

 

 

   解释:JobDetail:JobDetail 对象储存作业的侦听器、群组、数据映射、描述以及作业的其他属性,是作业状态的存储


     以上完成了QuartzHelloWord的编写,对Quartz有了初步的印象,下面对触发器进行点探讨。

     CronTrigger 支持类似日历的重复间隔,而不是单一的时间间隔.


    Cron 表达式包括以下 7 个字段:
   秒(0-59
   分(0-59
   小时(0-23
   每月第几天(1-31
   月(1-12JAN-DEC
   每星期第几天(1-7SUN-SAT
   年(1970-2099

  特殊字符
  " /"--表示增量值。例如,在秒字段中5/15代表从第 5 秒开始,每 15 秒一
其中「每月第几天」与「每星期第几天」是互斥的,两个只能设定一个,不设定的以 ? 符号代替,如果有好几个时间点,可以使用 , 符号,例如:「0 0 10,12,14 * * ?」表示每天的10时、12时、14时要执行Job
    "-"--表连续 ,例如「0 0 10,12,14 1-15 * ?」表示每月的115日每10时、12时、14时要执行Job时间格式中的年指定可有可无,例如:「0 0 10,12,14 ? * MON 2006」表2006年每星期一的10时、12时、14时要执行Job
   "?"--可以理解为只是站位的意思只有在月内日期和周内日期字段中可用,如果指定月内日期,可以在周内日期字段中插入?,表示周内日期值无关紧要

    "L"(last)--只有在月内日期和周内日期字段中可用,放在月内日期字段中,表示安排在当月最后一天执行;周内日期字段中,如L单独存在,就等7,否则代表当月内周内日期的最后一个实例。所0L表示安排在当月的最后一个星期日执行


   "w"--执行安排在最靠近指定值的工作日。把“1W放在月内日期字段中,表示把执行安排在当月的第一个工作日内。


   "#”--给定月份指定具体的工作日实例。把“MON#2放在周内日期字段中,表示把任务安排在当月的第二个星期一
     "*"--任意
  具体例子:
import java.util.Date;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.quartz.CronTrigger;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerFactory;
import org.quartz.SchedulerMetaData;
import org.quartz.impl.StdSchedulerFactory;

public class CronTriggerExample {


    public void run() throws Exception {
        Log log = LogFactory.getLog(CronTriggerExample.class);

        log.info("------- Initializing -------------------");

        // First we must get a reference to a scheduler
        SchedulerFactory sf = new StdSchedulerFactory();
        Scheduler sched = sf.getScheduler();

        log.info("------- Initialization Complete --------");

        log.info("------- Scheduling Jobs ----------------");

        // jobs can be scheduled before sched.start() has been called

        // job 1 will run every 20 seconds
        JobDetail job = new JobDetail("job1", "group1", SimpleJob.class);
        CronTrigger trigger = new CronTrigger("trigger1", "group1", "job1",
                "group1", "0/5 * * * * ?");
        sched.addJob(job, true);
        Date ft = sched.scheduleJob(trigger);
        log.info(job.getFullName() + " has been scheduled to run at: " + ft
                + " and repeat based on expression: "
                + trigger.getCronExpression());

        // job 2 will run every other minute (at 15 seconds past the minute)
        job = new JobDetail("job2", "group1", SimpleJob.class);
        trigger = new CronTrigger("trigger2", "group1", "job2", "group1",
                "15 0/2 * * * ?");
        sched.addJob(job, true);
        ft = sched.scheduleJob(trigger);
        log.info(job.getFullName() + " has been scheduled to run at: " + ft
                + " and repeat based on expression: "
                + trigger.getCronExpression());

        // job 3 will run every other minute but only between 8am and 5pm
        job = new JobDetail("job3", "group1", SimpleJob.class);
        trigger = new CronTrigger("trigger3", "group1", "job3", "group1",
                "0 0/2 8-17 * * ?");
        sched.addJob(job, true);
        ft = sched.scheduleJob(trigger);
        log.info(job.getFullName() + " has been scheduled to run at: " + ft
                + " and repeat based on expression: "
                + trigger.getCronExpression());

        // job 4 will run every three minutes but only between 5pm and 11pm
        job = new JobDetail("job4", "group1", SimpleJob.class);
        trigger = new CronTrigger("trigger4", "group1", "job4", "group1",
                "0 0/3 17-23 * * ?");
        sched.addJob(job, true);
        ft = sched.scheduleJob(trigger);
        log.info(job.getFullName() + " has been scheduled to run at: " + ft
                + " and repeat based on expression: "
                + trigger.getCronExpression());

        // job 5 will run at 10am on the 1st and 15th days of the month
        job = new JobDetail("job5", "group1", SimpleJob.class);
        trigger = new CronTrigger("trigger5", "group1", "job5", "group1",
                "0 0 10am 1,15 * ?");
        sched.addJob(job, true);
        ft = sched.scheduleJob(trigger);
        log.info(job.getFullName() + " has been scheduled to run at: " + ft
                + " and repeat based on expression: "
                + trigger.getCronExpression());

        // job 6 will run every 30 seconds but only on Weekdays (Monday through
        // Friday)
        job = new JobDetail("job6", "group1", SimpleJob.class);
        trigger = new CronTrigger("trigger6", "group1", "job6", "group1",
                "0,30 * * ? * MON-FRI");
        sched.addJob(job, true);
        ft = sched.scheduleJob(trigger);
        log.info(job.getFullName() + " has been scheduled to run at: " + ft
                + " and repeat based on expression: "
                + trigger.getCronExpression());

        // job 7 will run every 30 seconds but only on Weekends (Saturday and
        // Sunday)
        job = new JobDetail("job7", "group1", SimpleJob.class);
        trigger = new CronTrigger("trigger7", "group1", "job7", "group1",
                "0,30 * * ? * SAT,SUN");
        sched.addJob(job, true);
        ft = sched.scheduleJob(trigger);
        log.info(job.getFullName() + " has been scheduled to run at: " + ft
                + " and repeat based on expression: "
                + trigger.getCronExpression());

        log.info("------- Starting Scheduler ----------------");
        sched.start();

        log.info("------- Started Scheduler -----------------");

        log.info("------- Waiting five minutes... ------------");
        try {
            Thread.sleep(300L * 1000L);
        } catch (Exception e) {
        }

        log.info("------- Shutting Down ---------------------");

        sched.shutdown(true);

        log.info("------- Shutdown Complete -----------------");

        SchedulerMetaData metaData = sched.getMetaData();
        log.info("Executed " + metaData.numJobsExecuted() + " jobs.");

    }

    public static void main(String[] args) throws Exception {

        CronTriggerExample example = new CronTriggerExample();
        example.run();
    }

}

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值