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(
org.quartz.JobPersistenceException: Couldn't retrieve trigger: No record found for selection of Trigger with key: 'orderpay1-handler-trigger.orderpay1-handler-trigger' and statement: SELECT * FROM QRTZ_CRON_TRIGGERS WHERE SCHED_NAME = 'CBCCoreSchedulerInstance-Local' AND TRIGGER_NAME = ? AND TRIGGER_GROUP = ? at org.quartz.impl.jdbcjobstore.JobStoreSupport.retrieveTrigger(JobStoreSupport.java:1538) ~[quartz-2.3.2.jar:?] at org.quartz.impl.jdbcjobstore.JobStoreSupport.recoverMisfiredJobs(JobStoreSupport.java:984) ~[quartz-2.3.2.jar:?] at org.quartz.impl.jdbcjobstore.JobStoreSupport.doRecoverMisfires(JobStoreSupport.java:3264) ~[quartz-2.3.2.jar:?] at org.quartz.impl.jdbcjobstore.JobStoreSupport$MisfireHandler.manage(JobStoreSupport.java:4012) ~[quartz-2.3.2.jar:?] at org.quartz.impl.jdbcjobstore.JobStoreSupport$MisfireHandler.run(JobStoreSupport.java:4033) ~[quartz-2.3.2.jar:?] Caused by: java.lang.IllegalStateException: No record found for selection of Trigger with key: 'orderpay1-handler-trigger.orderpay1-handler-trigger' and statement: SELECT * FROM QRTZ_CRON_TRIGGERS WHERE SCHED_NAME = 'CBCCoreSchedulerInstance-Local' AND TRIGGER_NAME = ? AND TRIGGER_GROUP = ? at org.quartz.impl.jdbcjobstore.CronTriggerPersistenceDelegate.loadExtendedTriggerProperties(CronTriggerPersistenceDelegate.java:107) ~[quartz-2.3.2.jar:?] at org.quartz.impl.jdbcjobstore.StdJDBCDelegate.selectTrigger(StdJDBCDelegate.java:1819) ~[quartz-2.3.2.jar:?] at org.quartz.impl.jdbcjobstore.JobStoreSupport.retrieveTrigger(JobStoreSupport.java:1536) ~[quartz-2.3.2.jar:?] ... 4 more
最新发布
10-10
你提供的异常信息是 Quartz 调度框架在尝试恢复或执行定时任务时抛出的错误: ``` org.quartz.JobPersistenceException: Couldn't retrieve trigger: No record found for selection of Trigger with key: 'orderpay1-handler-trigger.orderpay1-handler-trigger' ``` --- ### 一、错误原因分析: 这个异常说明 Quartz 在数据库中查找某个触发器(Trigger)时失败,具体原因如下: #### 1. **触发器不存在** - 数据库表 `QRTZ_CRON_TRIGGERS` 中没有名为 `orderpay1-handler-trigger` 的触发器。 - 触发器可能已被手动删除或未正确初始化。 #### 2. **调度器使用了持久化配置(JDBC JobStore)** - Quartz 使用了数据库来持久化任务和触发器。 - 当调度器启动时尝试恢复任务,但找不到对应的触发器记录。 #### 3. **触发器名称或组名错误** - `TRIGGER_NAME = ? AND TRIGGER_GROUP = ?` 表示 Quartz 使用了参数化查询,但传入的名称和组名没有匹配到数据库中的记录。 #### 4. **任务恢复时出现不一致** - Quartz 的 misfire recovery 机制尝试恢复“错过执行”的任务时,找不到触发器元数据。 --- ### 二、解决方案: #### ✅ 1. 检查数据库中是否存在该触发器 执行如下 SQL 查询: ```sql SELECT * FROM QRTZ_CRON_TRIGGERS WHERE TRIGGER_NAME = 'orderpay1-handler-trigger' AND TRIGGER_GROUP = 'orderpay1-handler-trigger' AND SCHED_NAME = 'CBCCoreSchedulerInstance-Local'; ``` 如果没有结果,说明触发器确实不存在。 --- #### ✅ 2. 检查 Quartz 初始化逻辑 确保在系统启动时,该触发器被正确地添加到了调度器中: ```java Trigger trigger = TriggerBuilder.newTrigger() .withIdentity("orderpay1-handler-trigger", "orderpay1-handler-trigger") .withSchedule(CronScheduleBuilder.cronSchedule("0 0/5 * * * ?")) .build(); scheduler.scheduleJob(job, trigger); ``` --- #### ✅ 3. 清理 Quartz 表或重新初始化任务 如果确定该触发器已无用或已损坏,可以考虑: - 删除 Quartz 中相关的 JOB 和 TRIGGER 记录 - 重新部署任务和触发器 ```sql DELETE FROM QRTZ_CRON_TRIGGERS WHERE TRIGGER_NAME = 'orderpay1-handler-trigger'; DELETE FROM QRTZ_TRIGGERS WHERE TRIGGER_NAME = 'orderpay1-handler-trigger'; ``` --- #### ✅ 4. 避免调度器自动恢复失败的任务 在 `quartz.properties` 中可配置关闭自动恢复机制: ```properties org.quartz.jobStore.misfireThreshold = 60000 org.quartz.jobStore.dontRecoverJobs = true ``` --- ### 三、总结建议 | 步骤 | 操作 | |------|------| | 1 | 检查数据库中是否存在对应的触发器 | | 2 | 确保任务在启动时被正确注册 | | 3 | 如任务已不存在,清理 Quartz 相关表数据 | | 4 | 如需避免类似问题,可在配置中关闭自动恢复 | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值