首页 > 其他分享 >Quartz的使用

Quartz的使用

时间:2024-11-07 08:47:21浏览次数:8  
标签:触发器 Quartz 定义 任务 Job 实例 使用 执行

1.准备工作

建立Maven工程

2.引入Quartz的jar包

	<dependencies>
		<dependency>
			<groupId>org.quartz-scheduler</groupId>
			<artifactId>quartz</artifactId>
			<version>2.3.0</version>
		</dependency>
	</dependencies>

3.入门案例

创建HelloJob任务类

// 定义任务类
public class HelloJob implements Job {
	@Override
	public void execute(JobExecutionContext arg0) throws JobExecutionException {
		LocalDateTime now = LocalDateTime.now();
		// 定义工作任务内容
		System.out.println("进行数据库备份操作。当前任务执行的时间:"+now);
	}
}

创建任务调度类HelloSchedulerDemo

HelloSchedulerDemo.java

public class HelloSchedulerDemo {

	public static void main(String[] args) throws Exception {
		// 1:从工厂中获取任务调度的实例
        Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
        // 2:定义一个任务调度实例,将该实例与HelloJob绑定,任务类需要实现Job接口
        JobDetail job = JobBuilder.newJob(HelloJob.class)
                .withIdentity("job1", "group1") // 定义该实例唯一标识
                .build();
        // 3:定义触发器 ,马上执行, 然后每5秒重复执行一次
        Trigger trigger = TriggerBuilder.newTrigger()
                .withIdentity("trigger1", "group1") // 定义该实例唯一标识
                .startNow()  // 马上执行
                .withSchedule(SimpleScheduleBuilder.simpleSchedule()
        .repeatSecondlyForever(5)) // 每5秒执行一次   
                .build();
        // 4:使用触发器调度任务的执行
        scheduler.scheduleJob(job, trigger);
        // 5:开启
        scheduler.start();
        // 关闭
        // scheduler.shutdown();
	}
}

4.Job和JobDetail介绍

  • Job:工作任务调度的接口,任务类需要实现该接口。在里面编写任务执行的业务逻辑。

  • Job实例在Quartz中的生命周期:每次调度器执行Job时,它在调用execute方法前会创建一个新的Job实例,当调用完成后,关联的Job对象实例会被释放,释放的实例会被垃圾回收机制回收。

  • JobDetail:JobDetail为Job实例提供了许多设置属性,以及JobDataMap成员变量属性,它用来存储特定Job实例的状态信息,调度器需要借助JobDetail对象来添加Job实例。

  • JobDetail重要属性:name、group、jobClass、jobDataMap

    JobDetail job = JobBuilder.newJob(HelloJob.class)
            .withIdentity("job1", "group1") // 定义该实例唯一标识,并指定一个组。
            .build();
      
    System.out.println("name:"+job.getKey().getName());
    System.out.println("group:"+job.getKey().getGroup());
    System.out.println("jobClass:"+job.getJobClass().getName());
    

5.JobExecutionContext介绍

  • 当Scheduler调用一个Job,就会将JobExecutionContext传递给Job的execute()方法;
  • Job能通过JobExecutionContext对象访问到Quartz运行时候的环境以及Job本身的明细数据。

6.Trigger介绍

Quartz有一些不同的触发器类型,不过,用得最多的是SimpleTrigger和CronTrigger。

(1)jobKey

表示job实例的标识,触发器被触发时,该指定的job实例会被执行。

(2)startTime

表示触发器的时间表,第一次开始被触发的时间,它的数据类型是java.util.Date。

(3)endTime

指定触发器终止被触发的时间,它的数据类型是java.util.Date。

7.SimpleTrigger触发器

SimpleTrigger对于设置和使用是最为简单的一种 QuartzTrigger。

它是为那种需要在特定的日期/时间启动,且以一个可能的间隔时间重复执行 n 次的 Job 所设计的。

案例一:表示在一个指定的时间段内,执行一次作业任务;

HelloJobSimpleTrigger.java

// 定义任务类
public class HelloJobSimpleTrigger implements Job {
	@Override
	public void execute(JobExecutionContext context) throws JobExecutionException {
		LocalDateTime now = LocalDateTime.now();
		// 定义工作任务内容
		System.out.println("进行数据库备份操作。当前任务执行的时间:"+now);
	}
}

HelloSchedulerDemoSimpleTrigger.java

public class HelloSchedulerDemoSimpleTrigger {

	public static void main(String[] args) throws Exception {
		// 1:从工厂中获取任务调度的实例
        Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
        
        // 定义日期
        Date startDate = new Date();
        // 启动任务,任务在当前时间3秒后执行
        startDate.setTime(startDate.getTime()+3000);

        // 2:定义一个任务调度实例,将该实例与HelloJob绑定,任务类需要实现Job接口
        JobDetail job = JobBuilder.newJob(HelloJobSimpleTrigger.class)
        		.withIdentity("job1", "group1") // 定义该实例唯一标识
        		.build();

        // 3:定义触发器 ,马上执行, 然后每5秒重复执行一次
        Trigger trigger = TriggerBuilder.newTrigger()
        		.withIdentity("trigger1", "group1") // 定义该实例唯一标识
        		.startAt(startDate)
        		.build();

        // 4:使用触发器调度任务的执行
        scheduler.scheduleJob(job, trigger);
        
        // 5:开启
        scheduler.start();
        // 关闭
        // scheduler.shutdown();
	}
}

案例二:或在指定的时间间隔内多次执行作业任务。

修改HelloSchedulerDemoSimpleTrigger.java

	// 3:定义触发器 ,马上执行, 然后每5秒重复执行一次
    Trigger trigger = TriggerBuilder.newTrigger()
            .withIdentity("trigger1", "group1") // 定义该实例唯一标识
            .startAt(startDate)
            .withSchedule(SimpleScheduleBuilder.simpleSchedule().repeatSecondlyForever(5)
    				.withRepeatCount(2)) // 每5秒执行一次,连续执行3次后停止,默认值是0
            .build();

案例三:指定任务的结束时间。

修改HelloSchedulerDemoSimpleTrigger.java

// 定义日期
Date endDate = new Date();
// 启动结束,任务在当前时间10秒后停止
endDate.setTime(endDate.getTime()+10000);

// 2:定义一个任务调度实例,将该实例与HelloJob绑定,任务类需要实现Job接口
JobDetail job = JobBuilder.newJob(HelloJobSimpleTrigger.class)
		.withIdentity("job1", "group1") // 定义该实例唯一标识
		.build();

// 3:定义触发器 ,马上执行, 然后每5秒重复执行一次
Trigger trigger = TriggerBuilder.newTrigger()
		.withIdentity("trigger1", "group1") // 定义该实例唯一标识
		.startAt(startDate)
		.endAt(endDate)
		.withSchedule(SimpleScheduleBuilder.simpleSchedule().repeatSecondlyForever(5)
				.withRepeatCount(3)) // 每5秒执行一次,连续执行3次后停止
		.build();	

需要注意的点

  • SimpleTrigger的属性有:开始时间、结束时间、重复次数和重复的时间间隔。
  • 重复次数属性的值可以为0、正整数、或常量 SimpleTrigger.REPEAT_INDEFINITELY。
  • 重复的时间间隔属性值必须为大于0或长整型的正整数,以毫秒作为时间单位,当重复的时间间隔为0时,意味着与Trigger同时触发执行。
  • 如果有指定结束时间属性值,则结束时间属性优先于重复次数属性,这样的好处在于:当我们需要创建一个每间隔10秒钟触发一次直到指定的结束时间的 Trigger,而无需去计算从开始到结束的所重复的次数,我们只需简单的指定结束时间和使用REPEAT_INDEFINITELY作为重复次数的属性 值即可。

8.CronTrigger触发器

如果你需要像日历那样按日程来触发任务,而不是像SimpleTrigger 那样每隔特定的间隔时间触发,CronTriggers通常比SimpleTrigger更有用,因为它是基于日历的作业调度器。

使用CronTrigger,你可以指定诸如“每个周五中午”,或者“每个工作日的9:30”或者“从每个周一、周三、周五的上午9:00到上午10:00之间每隔五分钟”这样日程安排来触发。甚至,象SimpleTrigger一样,CronTrigger也有一个startTime以指定日程从什么时候开始,也有一个(可选的)endTime以指定何时日程不再继续。

(1)Cron Expressions——Cron 表达式

Cron表达式被用来配置CronTrigger实例。Cron表达式是一个由7个子表达式组成的字符串。每个子表达式都描述了一个单独的日程细节。这些子表达式用空格分隔,分别表示:

  1. Seconds 秒
  2. Minutes 分钟
  3. Hours 小时
  4. Day-of-Month 月中的天
  5. Month 月
  6. Day-of-Week 周中的天
  7. Year (optional field) 年(可选的域)

对于Cron表达式书写规范,我们通过以下两个表格来学习

序号单位是否必填允许添加的值允许使用的通配符
10~59, - * /
20~59, - * /
30~23, - * /
41~31, - * / ? L W
51~12 或者 JAN~DEC, - * /
61~7 或者 SUN~SAT, - * / ? L #
7empty 或者 1970~2099, - * /
通配符说明案例
,是一个分隔符秒位置上 20,40 。表示在第20秒和第40秒时触发任务
-是一个分区(区间)秒位置上 5-10。表示在第5、6、7、8、9、10秒都会触发任务
*表示任何值分位置上*。表示在每一个分钟都会触发任务
/表示递增秒位置上5/10。表示在5、15、25、35、45、55秒时触发任务
?表示不确定值因为我们在定日期时,一般确定了几日就没办法确定是周几,反之亦然
L表示最后日位置上写L。表示每月最后一天
周位置上写L。表示最后一周。
通常会和1~7配合使用。在周位置上写4L,表示本月最后一周的周三
W表示最近的工作日(单纯指定周一到周五)在日位置上写10W。表示如果10日是工作日就在10日执行。如果10日是周六,那么就9日执行。如果10日是周日,就11日执行
#表示第几个周位置上写6#3。表示每月第三个周五执行。如果#后面写的数字大了,是一个不存在的日期,就忽略不执行

618零时触发任务的表达式:0 0 0 18 6 ?

cron表达式生成器:http://cron.ciding.cc/

案例:

HelloJobCronTrigger.java

// 定义任务类
public class HelloJobCronTrigger implements Job {
	@Override
	public void execute(JobExecutionContext context) throws JobExecutionException {
		LocalDateTime now = LocalDateTime.now();
		// 定义工作任务内容
		System.out.println("进行数据库备份操作。当前任务执行的时间:"+now);
	}
}

HelloSchedulerDemoCronTrigger.java

public class HelloSchedulerDemoCronTrigger {

	public static void main(String[] args) throws Exception {
		// 1:从工厂中获取任务调度的实例
        Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();

        // 2:定义一个任务调度实例,将该实例与HelloJob绑定,任务类需要实现Job接口
        JobDetail job = JobBuilder.newJob(HelloJobCronTrigger.class)
        		.withIdentity("job1", "group1") // 定义该实例唯一标识
        		.build();

        // 3:定义触发器 ,马上执行, 然后每5秒重复执行一次
        Trigger trigger = TriggerBuilder.newTrigger()
        		.withIdentity("trigger1", "group1") // 定义该实例唯一标识
        		.withSchedule(CronScheduleBuilder.cronSchedule("0/5 * * 6 4 ?"))// 定义表达式
        		.build();

        // 4:使用触发器调度任务的执行
        scheduler.scheduleJob(job, trigger);
        
        // 5:开启
        scheduler.start();
        // 关闭
        // scheduler.shutdown();
	}
}

上一篇文章:Quartz的了解-CSDN博客icon-default.png?t=O83Ahttps://blog.csdn.net/Z0412_J0103/article/details/143355511下一篇文章: 全文检索ElasticSearch到底是什么?-CSDN博客icon-default.png?t=O83Ahttps://blog.csdn.net/Z0412_J0103/article/details/143556168

标签:触发器,Quartz,定义,任务,Job,实例,使用,执行
From: https://blog.csdn.net/Z0412_J0103/article/details/143355565

相关文章

  • 使用Python实现智能农业产量预测
    在现代农业中,精准化种植和高效管理是提高作物产量和质量的关键。通过深度学习技术,我们可以分析大量的农业数据,预测作物产量,从而优化种植策略,提升农业生产的效益和可持续性。本文将详细介绍如何使用Python构建一个智能农业产量预测的深度学习模型,并提供相关代码示例,帮助读者......
  • shodan的使用方法1(泷羽sec)
    声明学习视频来自B站UP主泷羽sec,如涉及侵泷羽sec权马上删除文章。笔记只是方便各位师傅学习知识,以下网站只涉及学习内容,其他的都与本人无关,切莫逾越法律红线,否则后果自负这节课旨在扩大自己在网络安全方面的知识面,了解网络安全领域的见闻,了解学习哪些知识对于我们渗透......
  • 个人练习前端技术使用Bootstrap、JQuery、thymeleaf
    说明:本代码只是为了本人练习前后端联动技术,包含html,jquery,thymeleaf模板、ajax请求及后端功能联动,方便自己查找及使用。@目录代码场景场景1.table批量查询功能(有默认值),点击"查询最新数据"从后台查询覆盖默认显示的数据场景2.新增,点击“新建”显示form表单,提交成功后隐藏form表......
  • 【51蛋骗鸡16路电子开关编程CD4067使用switch】2021-12-27
    缘由关于单片机矩阵键盘控制16路led-24小时必答区矩阵键值必须配合硬件对应,若矩阵接法不同则键值也不同,取键值可以直接调用矩阵扫描函数,按下按键后看P2输出Q0对应计算器最末位Q7对应第八位,并可发送一个值到P2验证.CD4067为十六路模拟开关,其内部包括一个16选1的译码器和......
  • 构建使用 Vite 和 Vue 的项目
    构建一个使用Vite和Vue的项目是一项非常实用且快速的方式,能够帮助开发者迅速搭建起一个现代前端应用的基础架构。以下是根据您提供的信息整理出的一个详细的步骤指南,用于指导如何从零开始创建一个Vite+Vue项目。准备工作确保您的计算机已经安装了Node.js。您可以通......
  • Android反编译:使用dex2jar查看dex文件
    APK解压之后,其中一个文件是dex。怎么查看呢?使用dex2jar。 下载解压GitHub-pxb1988/dex2jar:Toolstoworkwithandroid.dexandjava.classfiles https://github.com/pxb1988/dex2jar/releases 下载后解压,目录为dex-tools-2.1 操作把从apk中解压的dex复制到d......
  • 使用API 来进行Huawei ECS的开关机
    UseAPItoshut-downorstart-upHuaweiCloudECShttps://support.huaweicloud.com/intl/zh-cn/api-ecs/ecs_02_0301.htmlGetX-Subject-Tokenforauthorizationhttps://iam.ae-ad-1.g42cloud.com/v3/auth/tokensWegonnausePostmanfortestpurpose,ofcourseyo......
  • 剑侠情缘3网络版单机安装教程+70级版本修复任务打怪+GM使用
    天给大家带来一款单机游戏的架设:剑侠情缘3网络版单机安装教程+70级版本修复任务打怪。游戏版本:v1.5.1.1939只适用于单机娱乐,此教程是本人亲测所写,踩坑无数,如果你是小白跟着教程走也是可以搭建。    亲测视频演示https://githubs.xyz/show/302.mp4 游戏安装步骤......
  • 前端自学(5)-使用Vue组件库element书写前端代码
    element是饿了么团队研发的,一套为开发者,设计师和产品经理提供的基于Vue2.0的桌面端组件库。官网:Element-网站快速成型工具有了element组件库,开发人员就可以通过CV(复制粘贴。)制作出精美的前端页面。下面是一个简单页面的示例,我将为大家演示如何制作一个这样的页面。1.首......
  • [20241105]跟踪library cache lock library cache pin使用gdb(11g)2.txt
    [20241105]跟踪librarycachelocklibrarycachepin使用gdb(11g)2.txt--//前一段时间写的使用gdb跟踪librarycachelock/librarycachepin的脚本。--//我看过以前的笔记,当时测试过链接https://nenadnoveljic.com/blog/library-cache-lock-debugger/,我的测试在11g是失败.--//......