分布式调度系统-Quartz

Quartz

一. Quartz

1. 简介

Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,是完全由java开发的一个开源的任务日程管理系统,“任务进度管理器”就是一个在预先确定(被纳入日程)的时间到达时,负责执行(或者通知)其他软件组件的系统。

Quartz用一个小Java库发布文件(.jar文件),这个库文件包含了所有Quartz核心功能。这些功能的主要接口(API)是Scheduler接口。它提供了简单的操作,例如:将任务纳入日程或者从日程中取消,开始/停止/暂停日程进度。

2.定时器种类

  • SimpleTrigger :指定从某一个时间开始,以一定的时间间隔(单位是毫秒)执行的任务。适合的任务类似于:9:00 开始,每隔1小时,执行一次。
  • CronTirgger :适合于更复杂的任务,它支持类型于Linux Cron的语法(并且更强大)。基本上它覆盖了以上三个Trigger的绝大部分能力(但不是全部),通过Cron表达式来执行。

3.存储方式

类型优点缺点
RAMJobStore不要外部数据库,配置容易,运行速度快因为调度程序信息是存储在被分配给JVM的内存里面,所以,当应用程序停止运行时,所有调度信息将被丢失。另外因为存储到JVM内存里面,所以可以存储多少个Job和Trigger将会受到限制
JDBCJobStore支持集群,因为所有的任务信息都会保存到数据库中,可以控制事物,还有就是如果应用服务器关闭或者重启,任务信息都不会丢失,并且可以恢复因服务器关闭或者重启而导致执行失败的任务运行速度的快慢取决与连接数据库的快慢
4.基本概念
  • QuartzSchedulerThread :负责执行向QuartzScheduler注册的触发Trigger的工作的线程。

  • ThreadPool :Scheduler使用一个线程池作为任务运行的基础设施,任务通过共享线程池中的线程提供运行效率。

  • QuartzSchedulerResources :包含创建QuartzScheduler实例所需的所有资源(JobStore,ThreadPool等)。

  • SchedulerFactory :提供用于获取调度程序实例的客户端可用句柄的机制。

  • JobStore :通过类实现的接口,这些类要为org.quartz.core.QuartzScheduler的使用提供一个org.quartz.Job和org.quartz.Trigger存储机制。作业和触发器的存储应该以其名称和组的组合为唯一性。

  • QuartzScheduler :这是Quartz的核心,它是org.quartz.Scheduler接口的间接实现,包含调度org.quartz.Jobs,注册org.quartz.JobListener实例等的方法。

  • Scheduler :这是Quartz Scheduler的主要接口,代表一个独立运行容器。调度程序维护JobDetails和触发器的注册表。 一旦注册,调度程序负责执行作业,当他们的相关联的触发器触发(当他们的预定时间到达时)。

  • Trigger :具有所有触发器通用属性的基本接口,描述了job执行的时间出发规则。 - 使用TriggerBuilder实例化实际触发器。

  • JobDetail :传递给定作业实例的详细信息属性。 JobDetails将使用JobBuilder创建/定义。

  • Job :要由表示要执行的“作业”的类实现的接口。只有一个方法 void execute(jobExecutionContext context)
    (jobExecutionContext 提供调度上下文各种信息,运行时数据保存在jobDataMap中)

    注: 一个job可以被多个Trigger 绑定,但是一个Trigger只能绑定一个job!

二.快速入门

<!-- quartz -->
    <dependency>
         <groupId>org.quartz-scheduler</groupId>
         <artifactId>quartz</artifactId>
         <version>2.2.1</version>
    </dependency>
    <dependency>
            <groupId>org.quartz-scheduler</groupId>
            <artifactId>quartz-jobs</artifactId>
            <version>2.2.1</version>
        </dependency>
    public static void main(String[] args) throws InterruptedException, SchedulerException {
        //创建scheduler
        Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();

        //定义一个Trigger
//        Trigger trigger1 = newTrigger().withIdentity("trigger1", "group1") //定义name/group
//            .startNow()//一旦加入scheduler,立即生效
//            .withSchedule(simpleSchedule() //使用SimpleTrigger
//                .withIntervalInSeconds(1) //每隔一秒执行一次
//                .repeatForever()) //一直执行,奔腾到老不停歇
//            .build();

        //定义一个Trigger
        Trigger trigger2 = newTrigger().withIdentity("trigger1", "group1") //定义name/group
            .startNow()//一旦加入scheduler,立即生效
            .withSchedule(CronScheduleBuilder.cronSchedule("0/2 * * * * ?"))
            .build();

        //定义一个JobDetail
        JobDetail job = newJob(HelloJob.class) //定义Job类为HelloQuartz类,这是真正的执行逻辑所在
            .withIdentity("job1", "group1") //定义name/group
            .usingJobData("name", "quartz") //定义属性
            .build();

        //加入这个调度
        scheduler.scheduleJob(job, trigger2);

        //启动之
        scheduler.start();

        //运行一段时间后关闭
        Thread.sleep(10000);
        scheduler.shutdown(true);
    }
public class HelloJob implements Job{

    @Override
    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
        JobDetail detail = jobExecutionContext.getJobDetail();
        //TODO 获取JobDataMap中的键值对
        String name = detail.getJobDataMap().getString("name");
        System.err.println("say hello to " + name + " at " + new Date());
    }
}

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值