当前位置: 首页 > news >正文

Quartz(2-Trigger)

相关文章链接

  1. 定时任务工具类(Cron Util)
  2. SpringBoot Task
  3. Quartz(1-Job)
  4. Quartz(2-Trigger)

Trigger

方法

  1. 优先级(priority)

如果你的 trigger 很多(或者 Quartz 线程池的工作线程太少),Quartz 可能没有足够的资源同时触发所有的 trigger;这种情况下,你可能希望控制哪些 trigger 优先使用 Quartz 的工作线程,要达到该目的,可以在 trigger 上设置 priority 属性。

比如,你有 N 个 trigger 需要同时触发,但只有 Z 个工作线程,优先级最高的 Z 个 trigger 会被首先触发

  1. 错过触发(misfire instructions)

如果 scheduler 关闭了,或者 Quartz 线程池中没有可用的线程来执行 job,此时持久性的 trigger 就会错过(miss)其触发时间,即错过触发(misfire)。当下次调度器启动或者有可以线程时,会检查处于 misfire 状态的 Trigger。而 misfire 的状态值决定了调度器如何处理这个 Trigger。

不同类型的 trigger,有不同的 misfire 机制。它们默认都使用“智能机制(smart policy)”,即根据 trigger 的类型和配置动态调整行为

分类

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

SimpleTrigger

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

  1. startNow():Scheduler 开始执行时,触发器也即执行
  2. startAt():在指定的时间开始执行
  3. endAt():结束时间

执行间隔:

  1. withInterval(TimeSpan timeSpan):通用的间隔执行方法
  2. withIntervalInHours(int hours):以小时为间隔单位进行执行
  3. withIntervalInMinutes(int minutes):以分钟为间隔单位进行执行
  4. withIntervalInSeconds(int seconds):以秒为间隔单位进行执行

执行时间:

  1. withRepeatCount(int repeatCount):执行多少次以后结束
  2. repeatForever():永远执行
  3. repeatMinutelyForever():一分钟执行一次(永远执行)
  4. repeatMinutelyForever(int minutes):每隔几分钟执行一次(永远执行)
  5. repeatMinutelyForTotalCount(int count, int minutes):每隔几分钟执行一次(执行次数为 count)类似的还有秒、小时。
public class Trigger1 {public static void main(String[] args) throws SchedulerException {//创建一个 JobDetail 的实例,将该实例与 HelloJob 绑定JobDetail jobDetail = JobBuilder.newJob(HelloJob.class).withIdentity("testJob").build();//开始时间 3 秒钟之后 (具体时间按实际业务编写)Date sData = new Date();sData.setTime(sData.getTime() + 3000);//结束时间 20 秒钟之后 (具体时间按实际业务编写)Date eData = new Date();eData.setTime(eData.getTime() + 20000);//创建一个 Trigger 实例,定义该 job3 秒之后执行,在 6 秒之后结束SimpleTrigger zhlTrigger = TriggerBuilder.newTrigger().withIdentity("test").startAt(sData) //设定开始时间.endAt(eData)   //设定结束时间.withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(2) //每两秒打印一次.withRepeatCount(2)) // 重复 2 次.build();//创建 Scheduler 实例StdSchedulerFactory stdSchedulerFactory = new StdSchedulerFactory();Scheduler scheduler = stdSchedulerFactory.getScheduler();scheduler.start();scheduler.scheduleJob(jobDetail, zhlTrigger);}
}
public class HelloJob implements Job{public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {//打印当前的执行时间 例如 2017-11-22 00:00:00Date date = new Date();SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");System.out.println("现在的时间是:"+ sf.format(date));//具体的业务逻辑System.out.println("具体执行的业务...");JobKey key = jobExecutionContext.getJobDetail().getKey();Trigger trigger = jobExecutionContext.getTrigger();System.out.println("开始的时间:"+sf.format(trigger.getStartTime()));System.out.println("结束的事件:"+sf.format(trigger.getEndTime()));}
}

CronTrigger

指定对应的 cron 表达式执行任务

public class Trigger2 {public static void main(String[] args) throws SchedulerException {//创建一个 JobDetail 的实例,将该实例与 HelloJob 绑定JobDetail jobDetail = JobBuilder.newJob(HelloJob.class).withIdentity("test").build();//开始时间 3 秒钟之后 (具体时间按实际业务编写)Date sData = new Date();sData.setTime(sData.getTime() + 3000);//结束时间 20 秒钟之后 (具体时间按实际业务编写)Date eData = new Date();eData.setTime(eData.getTime() + 20000);//创建一个 Trigger 实例,定义该 job3 秒之后执行,在 6 秒之后结束CronTrigger trigger = TriggerBuilder.newTrigger().withIdentity("testTrigger").startAt(sData) //设定开始时间.endAt(eData)   //设定结束时间.withSchedule(CronScheduleBuilder.cronSchedule("0/3 * * * * ?")).build();//创建 Scheduler 实例StdSchedulerFactory stdSchedulerFactory = new StdSchedulerFactory();Scheduler scheduler = stdSchedulerFactory.getScheduler();scheduler.start();scheduler.scheduleJob(jobDetail, trigger);}
}

CalendarIntervalTrigger

用来触发基于定时重复的 JobDetail,Trigger 将会每隔 N 个 Calendar 在 Trigger 中定义的时间单元触发一次,这个 Trigger 不适合使用 SimpleTrigger 完成(例如由于每一个月的时间不是固定的描述),也不适用于 CronTrigger(例如每 5 个月)

相较于 SimpleTrigger 有两个优势:

  1. 更方便,比如:每隔 1 小时执行,你不用自己去计算 1 小时等于多少毫秒。
  2. 支持不是固定长度的间隔,比如:间隔为月和年。但劣势是精度只能到秒。

参数:

  1. interval:执行间隔
  2. intervalUnit:执行间隔的单位(秒、分钟、小时、天、月、年、星期)
public class Trigger4 {public static void main(String[] args) throws SchedulerException {//创建一个 JobDetail 的实例,将该实例与 HelloJob 绑定JobDetail jobDetail = JobBuilder.newJob(HelloJob.class).withIdentity("test").build();//开始时间 3 秒钟之后 (具体时间按实际业务编写)Date sData = new Date();sData.setTime(sData.getTime() + 3000);//结束时间 20 秒钟之后 (具体时间按实际业务编写)Date eData = new Date();eData.setTime(eData.getTime() + 20000);//创建一个 Trigger 实例,定义该 job3 秒之后执行,在 20 秒之后结束CalendarIntervalTrigger intervalTrigger = TriggerBuilder.newTrigger().withIdentity("testTrigger").startAt(sData) //设定开始时间.endAt(eData)   //设定结束时间.withSchedule(CalendarIntervalScheduleBuilder.calendarIntervalSchedule().withIntervalInSeconds(5))	// 每隔 5 秒执行一次.build();//创建 Scheduler 实例StdSchedulerFactory stdSchedulerFactory = new StdSchedulerFactory();Scheduler scheduler = stdSchedulerFactory.getScheduler();scheduler.start();scheduler.scheduleJob(jobDetail, intervalTrigger);}
}

DailyTimeIntervalTrigger

指定每天的某个时间段内,以一定的时间间隔执行任务,并且可以支持星期的设置

适合的任务类似于:指定每天 9:00 至 18:00,每隔 10 秒执行一次,并且只要周一至周五执行

参数:

  1. onEveryDay:每天
  2. onMondayThroughFriday:周一至周五,即工作日
  3. onSaturdayAndSunday:周六至周天,即休息日 e
  4. onDaysOfTheWeek:用数组的形式单独来指定一周中的哪几天
  5. startingDailyAt:表示开始于几点 (区别于前面的 StartAt)
  6. endingDailyAt:表示结束于几点 (区别于前面的 EndAt)
public class Trigger3 {public static void main(String[] args) throws SchedulerException {//创建一个 JobDetail 的实例,将该实例与 HelloJob 绑定JobDetail jobDetail = JobBuilder.newJob(HelloJob.class).withIdentity("test").build();//开始时间 3 秒钟之后 (具体时间按实际业务编写)Date sData = new Date();sData.setTime(sData.getTime() + 3000);//结束时间 20 秒钟之后 (具体时间按实际业务编写)Date eData = new Date();eData.setTime(eData.getTime() + 20000);//创建一个 Trigger 实例,定义该 job3 秒之后执行,在 20 秒之后结束DailyTimeIntervalTrigger trigger = TriggerBuilder.newTrigger().withIdentity("testTrigger").startAt(sData) //设定开始时间.endAt(eData)   //设定结束时间.withSchedule(DailyTimeIntervalScheduleBuilder.dailyTimeIntervalSchedule().withIntervalInSeconds(3).onEveryDay()) //每天每隔 3 秒执行一次.build();//创建 Scheduler 实例StdSchedulerFactory stdSchedulerFactory = new StdSchedulerFactory();Scheduler scheduler = stdSchedulerFactory.getScheduler();scheduler.start();scheduler.scheduleJob(jobDetail, trigger);}
}

MutableTrigger

Trigger 只是定义了相关属性的 Get 方法,并没有 Set 方法,而 MutableTrigger 接口则定义了相关属性的 set 方法,如:setKey 方法。

OperableTrigger

OperableTrigger 接口从字面上来说时可操作的 Trigger,也就是 Trigger 被 QuartzSchedulerThread 获取到之后,在不同情况下需要进行操作的接口。

  1. computeFirstFireTime:计算第一次触发时间。
  2. triggered:trigger 被触发时调用的方法。
  3. updateAfterMisfire:对应触发器失火后调用的方法。
  4. executionComplete:触发器本次触发完成时被调用的方法。

相关文章:

Quartz(2-Trigger)

相关文章链接 定时任务工具类(Cron Util)SpringBoot TaskQuartz(1-Job)Quartz(2-Trigger) Trigger 方法 优先级(priority) 如果你的 trigger 很多(或者 Quartz 线程…...

【微信小程序开发 - 3】:项目组成介绍

文章目录 项目组成介绍项目的基本组成结构小程序页面的组成部分JSON配置文件的作用app.json文件project.config.json文件sitemap.json文件页面的 .json 配置文件新建小程序页面修改项目首页 XWML模板XWML 和 HTML 的区别 WXSS样式WXSS 和 CSS 的区别 .js文件 项目组成介绍 项目…...

Leetcode 三角形最小路径和

算法思想与代码详解 这段代码采用的是**动态规划(Dynamic Programming)**的思想,用来解决“120. 三角形最小路径和”问题。动态规划通过将问题分解成更小的子问题,并通过保存子问题的解来避免重复计算,从而提高效率。…...

DataOps驱动数据集成创新:Apache DolphinScheduler SeaTunnel on Amazon Web Services

引言 在数字化转型的浪潮中,数据已成为企业最宝贵的资产之一。DataOps作为一种文化、流程和实践的集合,旨在提高数据管道的质量和效率,从而加速数据从源头到消费的过程。白鲸开源科技,作为DataOps领域的领先开源原生公司&#xf…...

Android Studio的笔记--BusyBox相关

BusyBox 相关 BusyBoxandroid上安装busybox和使用示例一、下载二、移动三、安装和设置环境变量四、使用 busybox源码下载和查看 BusyBox BUSYBOX BUSYBOX链接https://busybox.net/ 点击链接后如图 点击左边菜单栏的Get BusyBix中的Download Source 跳转到busybox 的下载源码…...

MySQL 存储过程与函数:增强数据库功能

一、MySQL 存储过程与函数概述 (一)存储过程的定义与特点 存储过程是一组预编译的 SQL 语句集合,它们被存储在数据库中,可根据需要被重复调用。例如,在一个电商系统中,经常需要查询某个时间段内的订单数据…...

网络安全(3)_安全套接字层SSL

4. 安全套接字层 4.1 安全套接字层(SSL)和传输层安全(TLS) (1)SSL/TLS提供的安全服务 ①SSL服务器鉴别,允许用户证实服务器的身份。支持SSL的客户端通过验证来自服务器的证书,来鉴别…...

Git 快速入门

Git 是什么? Git 是一个分布式版本控制系统四大区域: 工作区:项目文件的当前状态,即本地目录。暂存区:保存将要提交的文件快照,是一个中间层,使用git add将文件添加到暂存区。本地仓库&#xf…...

AI学习记录 - 依据 minimind 项目入门

想学习AI,还是需要从头到尾跑一边流程,最近看到这个项目 minimind, 我也记录下学习到的东西,需要结合项目的readme看。 1、github链接 https://github.com/jingyaogong/minimind?tabreadme-ov-file 2、硬件环境:英伟达4070ti …...

数据结构----链表头插中插尾插

一、链表的基本概念 链表是一种线性数据结构,它由一系列节点组成。每个节点包含两个主要部分: 数据域:用于存储数据元素,可以是任何类型的数据,如整数、字符、结构体等。指针域:用于存储下一个节点&#…...

设计模式-读书笔记

确认好: 模式名称 问题:在何时使用模式,包含设计中存在的问题以及问题存在的原因 解决方案:设计模式的组成部分,以及这些组成部分之间的相互关系,各自的职责和协作方式,用uml类图和核心代码描…...

c语言----选择结构

基本概念 选择结构是C语言中用于根据条件判断来执行不同代码块的结构。它允许程序在不同的条件下执行不同的操作,使程序具有决策能力。 if语句 单分支if语句 语法格式: if (条件表达式) { 执行语句块; } 功能: 当条件表达式的值为真&#…...

KS曲线python实现

目录 实战 实战 # 导入第三方模块 import pandas as pd import numpy as np import matplotlib.pyplot as plt# 自定义绘制ks曲线的函数 def plot_ks(y_test, y_score, positive_flag):# 对y_test重新设置索引y_test.index np.arange(len(y_test))# 构建目标数据集target_dat…...

解决matplotlib中文乱码问题

进入python,查看缓存 import matplotlib as mpl print(mpl.get_cachedir())如果结果为/Users/xxx/.matplotlib 那么就rm -rf /Users/xxx/.matplotlib 然后 mkdir ~/.fonts cd ~/.fonts wget http://129.204.205.246/downloads/SimHei.ttfsudo apt-get install fo…...

实操给桌面机器人加上超拟人音色

前面我们讲了怎么用CSK6大模型开发板做一个桌面机器人充当AI语音助理,近期上线超拟人方案,不仅大模型语音最快可以1秒内回复,还可以让我们的桌面机器人使用超拟人音色、具备声纹识别等能力,本文以csk6大模型开发板为例实操怎么把超…...

git stash 的文件如何找回

在Git中,如果你使用了git stash命令来保存你的工作进度,但之后想要找回这些被stash的文件,你可以按照以下步骤进行操作: 1. 查看stash列表 首先,使用git stash list命令来查看当前保存的所有stash记录。这个命令会列出…...

皮肤伤口分割数据集labelme格式248张5类别

数据集格式:labelme格式(不包含mask文件,仅仅包含jpg图片和对应的json文件) 图片数量(jpg文件个数):284 标注数量(json文件个数):284 标注类别数:5 标注类别名称:["bruises","burns","cu…...

uni-app开发AI康复锻炼小程序,帮助肢体受伤患者康复!

**提要:**近段时间我们收到多个康复机构用户,咨询AI运动识别插件是否可以应用于肢力运动受限患者的康复锻炼中来,插件是可以应用到AI康复锻炼中的,今天小编就为您介绍一下AI运动识别插件在康腹锻炼中的应用场景。 一、康复机构的应…...

双内核架构 Xenomai 4 安装教程

Xenomai 4是一种双内核架构, 继承了Xenomai系列的特点,通过在Linux内核中嵌入一个辅助核心(companion core),来提供实时能力。这个辅助核心专门处理那些需要极低且有界响应时间的任务。 本文将在官网教程(https://evlproject.org/…...

【redis的使用、账号流程、游戏服Handler的反射调用】1.自增id 2.全局用户名这样子名字唯一 3.

一、web服 1)账号注册 // 用于唯一命名服务 com.xinyue.game.center.business.account.logic.AccountRegisterService#accountRegister public void accountRegister(AccountEntity account) {accountManager.checkUsername(account.getUsername());accountManager.checkPass…...

Java 8 Stream API 入门到实践详解

一、告别 for 循环&#xff01; 传统痛点&#xff1a; Java 8 之前&#xff0c;集合操作离不开冗长的 for 循环和匿名类。例如&#xff0c;过滤列表中的偶数&#xff1a; List<Integer> list Arrays.asList(1, 2, 3, 4, 5); List<Integer> evens new ArrayList…...

.Net框架,除了EF还有很多很多......

文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...

在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:

在 HarmonyOS 应用开发中&#xff0c;手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力&#xff0c;既支持点击、长按、拖拽等基础单一手势的精细控制&#xff0c;也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档&#xff0c…...

【网络安全产品大调研系列】2. 体验漏洞扫描

前言 2023 年漏洞扫描服务市场规模预计为 3.06&#xff08;十亿美元&#xff09;。漏洞扫描服务市场行业预计将从 2024 年的 3.48&#xff08;十亿美元&#xff09;增长到 2032 年的 9.54&#xff08;十亿美元&#xff09;。预测期内漏洞扫描服务市场 CAGR&#xff08;增长率&…...

视频字幕质量评估的大规模细粒度基准

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用&#xff0c;因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型&#xff08;VLMs&#xff09;在字幕生成方面…...

Spring AI 入门:Java 开发者的生成式 AI 实践之路

一、Spring AI 简介 在人工智能技术快速迭代的今天&#xff0c;Spring AI 作为 Spring 生态系统的新生力量&#xff0c;正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务&#xff08;如 OpenAI、Anthropic&#xff09;的无缝对接&…...

HTML前端开发:JavaScript 常用事件详解

作为前端开发的核心&#xff0c;JavaScript 事件是用户与网页交互的基础。以下是常见事件的详细说明和用法示例&#xff1a; 1. onclick - 点击事件 当元素被单击时触发&#xff08;左键点击&#xff09; button.onclick function() {alert("按钮被点击了&#xff01;&…...

鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/

使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题&#xff1a;docker pull 失败 网络不同&#xff0c;需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...

JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作

一、上下文切换 即使单核CPU也可以进行多线程执行代码&#xff0c;CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短&#xff0c;所以CPU会不断地切换线程执行&#xff0c;从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...

Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理

引言 Bitmap&#xff08;位图&#xff09;是Android应用内存占用的“头号杀手”。一张1080P&#xff08;1920x1080&#xff09;的图片以ARGB_8888格式加载时&#xff0c;内存占用高达8MB&#xff08;192010804字节&#xff09;。据统计&#xff0c;超过60%的应用OOM崩溃与Bitm…...