简单的Quartz搭建和入门

本文详细介绍了Quartz框架,一个强大的Java库,用于创建和管理定时任务。它由job(业务逻辑)、trigger(触发时机)和scheduler(调度器)组成,演示了如何创建job实例、配置trigger执行周期及jobdetailmap的数据传递。理解jobdetail和jobdetailmap的作用,以及SimpleTrigger和CronTrigger的区别,有助于提升任务调度的效率和灵活性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

什么是Quartz?

Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,它可以与J2EE与J2SE应用程序相结合也可以单独使用。Quartz可以用来创建简单或为运行十个,百个,甚至是好几万个Jobs这样复杂的程序。Jobs可以做成标准的Java组件或 EJBs。Quartz的最新版本为Quartz 2.3 。--------------------百度百科
简单的来说,主要是用来执行定时任务。

核心体系

1.job:实现业务逻辑。
2.trigger:触发器(什么时候去调用)
3.scheduler:调度器(把job和trigger绑定再一起)

job

在job接口中只有一个方法就是execute方法。

package org.quartz;

public interface Job {
    void execute(JobExecutionContext var1) throws JobExecutionException;
}

自己写一个业务逻辑实现这个接口

public class myjob implements Job {

    @Override
    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {

 //这里取出jobdetail里的值
        Object jv1 = jobExecutionContext.getJobDetail().getJobDataMap().get("jv1");

        System.out.println("hello job"+jv1);
        }

schedule

一个简单的实例:每两秒重复一次业务逻辑

public class myschedule {
    public static void main(String[] args) throws SchedulerException {
//创建jobdetail
       JobDetail job = JobBuilder
               .newJob(myjob.class)
               .withIdentity("job1","group1")
               .build();
               //在jobdetailmap里放入值
       job.getJobDataMap().put("jv1","这是job");
//创建trigger
        Trigger trigger = TriggerBuilder
                .newTrigger()
                .withIdentity("trigger1","group1")
                .startAt(new Date())  //从现在开始
                .withSchedule(SimpleScheduleBuilder //每隔两个秒重复一次
                .repeatSecondlyForever(2))
                .build();
        //创建一个scheduler
        Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
        //注册trigger并启动scheduler
        scheduler.scheduleJob(job,trigger);
        scheduler.start();

    }

}

结果是每隔两秒就是hello job和jobdetail里的值
在这里插入图片描述

为什么要有job和jobdetail两个类?
 在上面的实例中我们传给scheduler一个JobDetail实例,因为我们在创建JobDetail时,将要执行的job的类名传给了JobDetail,所以scheduler就知道了要执行何种类型的job;每次当scheduler执行job时,在调用其execute(…)方法之前会创建该类的一个新的实例;执行完毕,对该实例的引用就被丢弃了,实例会被垃圾回收;这种执行策略带来的一个后果是,job必须有一个无参的构造函数(当使用默认的JobFactory时);另一个后果是,在job类中,不应该定义有状态的数据属性,因为在job的多次执行中,这些属性的值不会保留。
jobdetailmap的作用?
在Job执行时,JobExecutionContext中的JobDataMap为我们提供了很多的便利。它是JobDetail中的JobDataMap和Trigger中的JobDataMap的并集,但是如果存在相同的数据,则后者会覆盖前者的值。
所以jobdetailmap主要作用是在各个地方实现数据的传递。

trigger

trigger分为SimpleTrigger和CronTrigger。
SimpleTrigger可以满足的调度需求是:在具体的时间点执行一次,或者在具体的时间点执行,并且以指定的间隔重复执行若干次。
CronTrigger是基于日历的概念指定间隔进行重新启动的作业启动计划。
上面已经演示了simpleTrigger,这里写一个CronTrigger

 trigger = newTrigger()
    .withIdentity("trigger3", "group1")
    .withSchedule(cronSchedule("0 0/2 8-17 * * ?"))
    .forJob("myJob", "group1")
    .build();

0 0/2 8-17 * * ?,按照顺序分别是秒 分 时 日 月 年 ,其中?后面代表着允许星期几的字段。*代表是通配符代表每个(每个月,每天,每小时),0/2 代表着每隔两分钟
上面这个表示为每天上午8点至下午5点之间每隔一分钟触发一次。

 trigger = newTrigger()
    .withIdentity("trigger3", "group1")
    .withSchedule(weeklyOnDayAndHourAndMinute(DateBuilder.WEDNESDAY, 10, 42))
    .forJob(myJobKey)
    .inTimeZone(TimeZone.getTimeZone("America/Los_Angeles"))
    .build();

这是另一种方式。
上面这么表示为将在星期三上午10:42在TimeZone(系统默认值)之外触发。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值