任务调度框架Quartz简单入门

Java任务调度器Quartz介绍

1. Quartz介绍

维基百科:Quartz是一个Java下作业控制的开源框架。Quartz用来创建或简单或复杂的调度时间表,执行Java下任意数量的作业。版本1.0发布于2002年9月13日,当前版本2.2.1发布于2013年9月24日。
可以通过CronTrigger定义Quartz的调度时间表(例如0 0 12 ? * WED表示“每周三上午12:00”)。此外,时间表也可以通过SimpleTrigger,由Date定义触发的开始时间、毫秒的时间间隔和重复计数(例如“在下周三12:00,然后每隔10秒、执行5次”)。可以使用Calender定义例外的日程(例如“没有周末和节假日”)。
作业可以是实现了Job接口任意的Java类。作业监听器(JobListener)和触发器监听器(TriggerListener)通知作业的执行(和其他事件)。作业及其触发器可以被持久化。
Quartz一般用于企业级应用程序,以支持工作流、系统管理(维护)活动,并在应用程序中提供实时的服务。Quartz还支持集群。
Quartz是Terracotta公司的开源产品。 .NET平台下的对应产品叫Quartz.NET。

2. 核心组件JobDetail

JobDetai是quartz框架核心组件之一,他的作用是绑定需要执行业务逻辑的类,具体代码结构如下

JobDetail jobDetail=JobBuilder.newJob(HelloJob.class).withIdentity("job名称", "job组").build();
  • job每次调用都会创建一个新的实例,newJob里面的参数,便是开发者自己业务逻辑的代码,这个类需要实现一个接口Job,他有一个唯一的方法execute(JobExecutionContext context),这个方法里面的参数JobExecutionContext 的作用就是我们可以获取从Scheduler里面传递过来的各种参数。例如:
    刚才的JobDetail实例中可以使用usingJobData这个链式写法来传递我们的参数
JobDetail jobDetail=JobBuilder.newJob(HelloJob.class).usingJobData("传递值key", "传递值Value").withIdentity("myJob", "jobGroup").build();

那么我们如何在Job类里面获取呢?(这里介绍最简单的一种方式,使用getJobDataMap()的方式不再介绍。)

//我们创建一个与usingJobData(key,value)的key相同名称的字符串
private String key;
//实现他的get与set方法
public String getKey() {
        return key;
    }
    public void setKey(String key) {
        this.key = key;
    }
//直接获取
System.out.println(key);

3.聊聊Trigger

  • trigger同样是quartz框架的核心组件,他是用来处理调度任务的核心所在,有了他,可以设置我们的调度任务多久执行,执行多少次,什么时候开始,结束。用的最多的是SimpleTrigger与CronTriger,我们先看一个SimpleTrigger如何创建的:
//这里创建的是每秒都执行一下我们的任务,永远的执行下去
SimpleTrigger simpleTrigger=(SimpleTrigger) TriggerBuilder.newTrigger().withIdentity("trrigerName","triggerGroup")
.startNow().withSchedule(SimpleScheduleBuilder.repeatSecondlyForever(1)).build();
  • 接下来是重点的CronTrigger,说到这个我们CronTrigger就不得不提Cron表达式Cron表达式百度一大把,这里就不赘述了。
//这个表达式和上面是一样的功能,也是每秒执行一次,永远执行下去
CronTrigger cronTrigger=(CronTrigger) TriggerBuilder.newTrigger().withSchedule(CronScheduleBuilder.cronSchedule("* * * * * ?")).withIdentity("triggerName", "triggerGroup").build();
  • Cron表达式:
    秒 分 时 日 月 周 年
    比如2017年的10月1日15点0分0秒执行,每5分秒钟执行一次
    0/5 0 15 1 10 ? 2017 这里周不关心,填写?就行了。/表示每,-表示至,比如10-16表示10到16,*和?代表任意等等。

3.Scheduler

Scheduler实际上按照我的理解就是一个启动器,他绑定不同的JobDetail和Trigger,然后控制他们执行调度任务。

//采用工厂的模式创建Scheduler
SchedulerFactory schedulerFactory=new StdSchedulerFactory();
        Scheduler scheduler=schedulerFactory.getScheduler();
        //绑定JobDetail和Trigger
        scheduler.scheduleJob(jobDetail,simpleTrigger);
        //执行任务调度。
        scheduler.start();

4.总结

这些其实是quartz的基本入门知识,要深入理解还需要查阅网上的资料。但是对于我们工作来说,如果用不到,那就当做一个了解,以后用到的时候,非常的容易上手,而且现在企业使用quartz比较多,可能也能成为我们面试的一个必备技能。

5.附上源码

  • HelloJob.class
public class HelloJob implements Job{
    private String key;
    public void execute(JobExecutionContext context) throws JobExecutionException {

        // TODO Auto-generated method stub
        Date date=new Date();
        SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println("当前job执行时间为:"+sdf.format(date));
        JobDetail jobDetail=context.getJobDetail();
        JobKey jobKey=jobDetail.getKey();
        System.out.println("当前执行job信息:"+"job名称-->"+jobKey.getName()+"job组-->"+jobKey.getGroup());
        Trigger trigger=context.getTrigger();
        System.out.println("当前执行的Trigger信息:"+"trigger名称-->"+trigger.getJobKey().getName()+"trigger组-->"+trigger.getJobKey().getGroup());
        System.out.println("Hello World");
        System.out.println(key);
    }
    public String getKey() {
        return key;
    }
    public void setKey(String key) {
        this.key = key;
    }
  • TestScheduler.class
    public static void main(String[] args) throws SchedulerException {
        Date date=new Date();
        SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println("当前系统时间为:"+sdf.format(date));
        JobDetail jobDetail=JobBuilder.newJob(HelloJob.class).usingJobData("key", "Value").withIdentity("myJob", "jobGroup").build();
//      CronTrigger cronTrigger=(CronTrigger) TriggerBuilder.newTrigger().withSchedule(CronScheduleBuilder.cronSchedule("* * * * * ?"))
//              .withIdentity("triggerName", "triggerGroup").build();
        SimpleTrigger simpleTrigger=(SimpleTrigger) TriggerBuilder.newTrigger().withIdentity("trrigerName","triggerGroup")
                .startNow().withSchedule(SimpleScheduleBuilder.repeatSecondlyForever(1)).build();
        SchedulerFactory schedulerFactory=new StdSchedulerFactory();
        Scheduler scheduler=schedulerFactory.getScheduler();
        scheduler.scheduleJob(jobDetail,simpleTrigger);
        scheduler.start();
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值