定时任务框架——Quartz

Quartz:由Java实现的任务调度框架。可以用来创建简单或为运行十个,百个,甚至是好几万个Jobs这样复杂的程序。
Quartz使用:
1.创建任务调度控制器

Scheduler scheduler= new StdSchedulerFactory().getScheduler();

2.创建任务实现逻辑类Job(只需要实现Job接口execute()为任务实现)

public class JobTask implements Job{

	@Override
	public void execute(JobExecutionContext arg) throws JobExecutionException {
	}
}
  1. 定义任务描述类JobDetail
        JobDetail job = new JobDetail();
		job.setName("任务”); //为任务起一个名称
		job.setJobClass(new JobTask () );
  1. 运行任务
    定义一个触发器Trigger(SimpleTrigger、CronTrigger、DataIntervalTrigger和NthIncludedTrigger),trigger状态:WAITING,ACQUIRED,EXECUTING,COMPLETE,BLOCKED,ERROR,PAUSED,PAUSED_BLOCKED,DELETED。
    规定任务的执行策略(包括名称、开始时间、结束时间、重复执行次数、执行间隔)
   Trigger trigger =  new SimpleTrigger(config.getName(), null,
						startDate.getTime(), null,
						SimpleTrigger.REPEAT_INDEFINITELY,
						periodTime * 60 * 1000L);
//调用任务执行类执行任务
		scheduler.deleteJob(job.getName(), Scheduler.DEFAULT_GROUP);
		scheduler.scheduleJob(job, trigger);

Quartz实现原理:
主要组成部分:

scheduler(调度器):将job和trigger绑定在一起

job(任务) :配置具体哪个类实现定时任务

trigger(触发器) :配置定时器参数,如:多久执行一次,执行多上次等

在这里插入图片描述

Quartz工作原理

分两类线程:

Scheduler调度线程
任务执行线程

原理

   执行常规调度的线程,常规调度线程轮询存储的所有trigger,如果有trigger到达了下一次触发的时间(用wait和notifyAll实现),则从任务执行线程池获取一个空闲线程,执行与该trigger关联的任务。

在这里插入图片描述

Scheduler调度线程主要有两个:

执行常规调度的线程
执行misfiredtrigger的线程,Misfire线程是扫描所有的trigger,查看是否有misfiredtrigger,如果有的话根据misfire的策略分别处理(fire now OR wait for the next fire)。

Quartz是一个开源的作业调度框架,可以用来调度Java应用程序中的任务。在Quartz中,任务是由一个Trigger和一个Job组成的。Trigger定义了任务何时执行,Job则定义了任务具体要做什么。在Quartz中,我们可以通过编写代码来创建Trigger和Job,并将它们注册到Scheduler中,Scheduler会按照Trigger定义的时间执行Job。 在Quartz中,时间的定义是通过Cron表达式来进行的。Cron表达式是一个字符串,包含6或7个字段,每个字段表示一个时间单位。下面是一个标准的Cron表达式的格式: ``` 秒 分 时 日 月 周 年(可选) ``` 其中,每个字段的含义如下: - 秒:0-59 - 分:0-59 - 时:0-23 - 日:1-31 - 月:1-12 - 周:0-6(0表示周日,1表示周一,以此类推) - 年:可选,表示指定的年份(例如2021) 下面是一个例子: ``` 0 0/5 8-18 * * ? // 每天8点到18点之间,每隔5分钟执行一次 ``` 这个表达式的意思是,在每天的8点到18点之间,每隔5分钟执行一次。 在Quartz中,我们可以通过Cron表达式来定义Trigger的执行时间。下面是一个例子: ```java // 创建一个Trigger,并设置执行时间为每天的8点到18点之间,每隔5分钟执行一次 Trigger trigger = TriggerBuilder.newTrigger() .withSchedule(CronScheduleBuilder.cronSchedule("0 0/5 8-18 * * ?")) .build(); ``` 这个例子中,我们通过CronScheduleBuilder来创建一个Cron表达式,并将其设置到Trigger中。然后,我们可以将这个Trigger注册到Scheduler中,Scheduler会按照Trigger定义的时间执行Job。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值