Quartz 学习总结

Quartz是什么?

Quartz是一个开源的任务调度框架。基于定时、定期的策略来执行任务是它的核心功能,比如x年x月的每个星期五上午8点到9点,每隔10分钟执行1次。Quartz有3个核心要素:调度器(Scheduler)、任务(Job)、触发器(Trigger)。Quartz完全使用Java开发,可以集成到各种规模的应用程序中。它能够承载成千上万的任务调度,并且支持集群。它支持将数据存储到数据库中以实现持久化,并支持绝大多数的数据库。它将任务与触发设计为松耦合,即一个任务可以对应多个触发器,这样能够轻松构造出极为复杂的触发策略。

现在我们来看一个简单的示例:

public static void main(String arg[]) {
        try {
            //创建调度工厂
            SchedulerFactory schedulerFactory = new StdSchedulerFactory();
            //从工厂中获取调度器
            Scheduler scheduler = schedulerFactory.getScheduler();
            //启动调度器
            scheduler.start();
            //创建job详细信息:创建helloJob实例并设置jobName和所属group,并设为当程序挂掉重启之后可重新恢复轮询
            JobDetail jobDetail = JobBuilder.newJob(HelloJob.class).withIdentity(JobKey.jobKey("jobName", "jobGroupName"))
                    .requestRecovery().build();
            //创建一个simpleSchedule,轮询五次,间隔5秒钟
            SimpleScheduleBuilder scheduleBuilder = SimpleScheduleBuilder.simpleSchedule().withRepeatCount(5)
                    .withIntervalInSeconds(5);
            //创建一个simpleTrigger 触发器,设置触发器的身份标识,绑定调度器,并设为立即启动
            SimpleTrigger simpleTrigger = TriggerBuilder.newTrigger().withIdentity("triggerName", "triggerGroupName")
                    .withSchedule(scheduleBuilder).startNow().build();
            scheduler.scheduleJob(jobDetail, simpleTrigger);
        } catch (SchedulerException e) {
            System.out.println("报错");
        }

    }

接下来看一下HelloJob类,是一个实现了Job接口的类,它只有execute这一个方法。我们来看一job源码,以及hellojob代码:

hellojob代码:
public class HelloJob implements Job {
   

    private static Logger logger = LoggerFactory.getLogger(HelloJob.class);

    @Override
    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
        logger.info("hello jon执行时间: " + LocalTime.now());
        System.out.print("hello jon执行时间: " + LocalTime.now());
    }
}
job源码:
public interface Job {
    void execute(JobExecutionContext var1) throws JobExecutionException;
}

至此我们实现了一个简单调度任,当Job的Trigger激活时,该方法将被Scheduler的一个线程调用执行。JobExecutionContext 是传递给该方法的运行时环境信息,包括调用它的调度器、触发该执行的Trigger、JobDetail对象以及其他信息。
接下来我们来看一下上面用到jobDetail以及schedule等核心api和触发器的介绍

核心api和触发器的介绍

Quartz API主要包含以下接口:

Scheduler:与调度器交互的主要API。

Job:一个接口,实现该接口的组件将被调度器运行。

JobDetail:用于定义Job实例。JobDetail是在Job被添加到Scheduler时由应用程序创建的,它包含了关于Job的各种属性信息,都在JobDataMap中

Trigger:定义了一个Job如何被调度器所运行。Trigger用于触发任务的执行。它也会关联到的一个JobDataMap–当需要把数据传递给触发器特定的某个任务时这很有用。Quartz提供了各种触发器,然而最常用的是SimpleTrigger 和CronTrigger。
JobBuilder:用于定义/构建JobDetail 实例。

TriggerBuilder:用于定义/构建Trigger实例。

DateBuilder:用于创建时间类型的实例。

Scheduler由SchedulerFactory创建,并随着shutdown方法的调用而终止。创建后它将可被用来添加、删除或列出Job和Trigger,或执行一些调度相关的工作,(比如暂停)。只有通过start()方法启动后它才会真的工作。

Job与JobDetail关系

JobDetail 定义的是任务数据,而真正的执行逻辑是在Job中,例子中是HelloJob。 为什么设计成JobDetail + Job,不直接使用Job?这是因为任务是有可能并发执行,如果Scheduler直接使用Job,就会存在对同一个Job实例并发访问的问题。而JobDetail & Job 方式,sheduler每次执行,都会根据JobDetai

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值