IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> quartz动态设置cron -> 正文阅读

[Java知识库]quartz动态设置cron

学习quartz cron表达式定时任务笔记,主要是想实现特定日期时间点执行定时任务.

1.测试任务类
package com.example.demo330.signin;

import com.example.demo330.utils.QuartzManager;
import org.quartz.*;
import org.quartz.impl.JobDetailImpl;

import java.text.SimpleDateFormat;
import java.util.Date;

public class SignInJob implements Job {
    static int count = 0;
    static String cron = "0/5 * * * * ? *";

    @Override
    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
        JobDetailImpl jdi = (JobDetailImpl) jobExecutionContext.getJobDetail();

        JobKey jk = jdi.getKey();

        String jobName = jk.getName();
        String jobGroup = jk.getGroup();
        Trigger trigger = jobExecutionContext.getTrigger();
        TriggerKey key = trigger.getKey();
        String name = key.getName();
        String group = key.getGroup();

        count = count + 1;
        //测试更改下cron表达式 
        if (count > 5) {
            cron = "0/10 * * * * ? *";
            if (count > 10)
                count = 0;
        } else {
            cron = "0/5 * * * * ? *";
        }

        String printTime = new SimpleDateFormat("yy-MM-dd HH-mm-ss").format(new Date());
        System.out.println("SignInJob start at:" + printTime + "--jobName:" + jobName + "--jobGroup:" + jobGroup +
                "--triggerName:" + name + "--triggerGroup:" + group + "--count:" + count +"--cron:"+cron);

        QuartzManager.modifyJobTime(key, cron);
    }
}

2.Quartz管理类 添加 启动 修改 停止
package com.example.demo330.utils;

import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;

public class QuartzManager {

    public static StdSchedulerFactory sf = new StdSchedulerFactory();

    /**
     * 添加cronTrigger的定时器
     *
     * @param jobKey     .
     * @param triggerKey .
     * @param jobClass   .
     * @param cro        .
     * @param jobDataMap .
     */
    public static void addJob(JobKey jobKey,
                              TriggerKey triggerKey,
                              Class<? extends Job> jobClass,
                              String cro,
                              JobDataMap jobDataMap) {

        try {
            // 任务名,任务组,任务执行类;可以将自己需要的额外信息添加到jobdatamap中。
            JobDetail jobDetail = JobBuilder.newJob(jobClass).withIdentity(jobKey).setJobData(jobDataMap).build();
            //触发器
            TriggerBuilder<Trigger> triggerBuilder = TriggerBuilder.newTrigger();
            //触发器名 触发器组
            triggerBuilder.withIdentity(triggerKey);
            //现在执行
            triggerBuilder.startNow();
            //触发器规则
            triggerBuilder.withSchedule(CronScheduleBuilder.cronSchedule(cro));
            //创建CronTrigger对象
            CronTrigger trigger = (CronTrigger) triggerBuilder.build();
            //创建调度器
            Scheduler scheduler = sf.getScheduler();
            //调度器设置jobDetail,trigger
            scheduler.scheduleJob(jobDetail, trigger);
            if (!scheduler.isShutdown())
                scheduler.start();

        } catch (Exception e) {
            //e.printStackTrace();
            throw new RuntimeException(e);
        }
    }

    /**
     * 修改cronTrigger定时器
     *
     * @param triggerKey .
     * @param cron       .
     */
    public static void modifyJobTime(TriggerKey triggerKey, String cron) {
        try {
            Scheduler scheduler = sf.getScheduler();
            //TriggerKey triggerKey1 = TriggerKey.triggerKey(triggerKey.getName(), triggerKey.getGroup());
            CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerKey);
            if (trigger == null)
                return;
            String oldTime = trigger.getCronExpression();
            if (!oldTime.equalsIgnoreCase(cron)) {
                /** 方式一 :调用 rescheduleJob 开始 */
                // 触发器
                TriggerBuilder<Trigger> triggerBuilder = TriggerBuilder.newTrigger();
                // 触发器名,触发器组
                triggerBuilder.withIdentity(triggerKey);
                // 立即执行
                triggerBuilder.startNow();
                // 触发器时间设定
                triggerBuilder.withSchedule(CronScheduleBuilder.cronSchedule(cron));
                // 创建Trigger对象
                trigger = (CronTrigger) triggerBuilder.build();
                // 修改一个任务的触发时间
                scheduler.rescheduleJob(triggerKey, trigger);

                /** 方式二:先删除,然后在创建一个新的Job */
                // JobDetail jobDetail = sched.getJobDetail(JobKey.jobKey(jobName, jobGroupName));
                // Class<? extends Job> jobClass = jobDetail.getJobClass();
                // removeJob(jobName, jobGroupName, triggerName, triggerGroupName);
                // addJob(jobName, jobGroupName, triggerName, triggerGroupName, jobClass, cron);
            } else {
                //System.out.println("--------------------------------------------------------------------cron相同 不处理");
            }
        } catch (SchedulerException e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * 启动所有任务
     */
    public static void startJobs() {
        try {
            sf.getScheduler().start();
        } catch (SchedulerException e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * 关闭所有定时任务
     */
    public static void shutdownJobs() {
        try {
            if (!sf.getScheduler().isShutdown())
                sf.getScheduler().shutdown();
        } catch (SchedulerException e) {
            //e.printStackTrace();
            throw new RuntimeException(e);
        }
    }


}

3.开启定时任务
		JobDataMap dataMap1 = new JobDataMap();
        dataMap1.put("类型1", "one");
        dataMap1.put("类型2", "two");

        JobKey jobKey = new JobKey("cron任务1", "任务组名1");
        TriggerKey triggerKey = new TriggerKey("cron触发器1", "cron触发器组名1");
        QuartzManager.addJob(jobKey,triggerKey,SignInJob.class,"0/5 * * * * ? *",dataMap1);
		//开启定时任务
        QuartzManager.startJobs();

  • 测试job执行中 修改cron 定时配置. 5秒改为10秒执行一次.
SignInJob start at:22-04-08 14-46-20--jobName:cron任务1--jobGroup:任务组名1--triggerName:cron触发器1--triggerGroup:cron触发器组名1--count:1--cron:0/5 * * * * ? *
SignInJob start at:22-04-08 14-46-25--jobName:cron任务1--jobGroup:任务组名1--triggerName:cron触发器1--triggerGroup:cron触发器组名1--count:2--cron:0/5 * * * * ? *
SignInJob start at:22-04-08 14-46-30--jobName:cron任务1--jobGroup:任务组名1--triggerName:cron触发器1--triggerGroup:cron触发器组名1--count:3--cron:0/5 * * * * ? *
SignInJob start at:22-04-08 14-46-35--jobName:cron任务1--jobGroup:任务组名1--triggerName:cron触发器1--triggerGroup:cron触发器组名1--count:4--cron:0/5 * * * * ? *
SignInJob start at:22-04-08 14-46-40--jobName:cron任务1--jobGroup:任务组名1--triggerName:cron触发器1--triggerGroup:cron触发器组名1--count:5--cron:0/5 * * * * ? *
SignInJob start at:22-04-08 14-46-45--jobName:cron任务1--jobGroup:任务组名1--triggerName:cron触发器1--triggerGroup:cron触发器组名1--count:6--cron:0/10 * * * * ? *
SignInJob start at:22-04-08 14-46-50--jobName:cron任务1--jobGroup:任务组名1--triggerName:cron触发器1--triggerGroup:cron触发器组名1--count:7--cron:0/10 * * * * ? *
SignInJob start at:22-04-08 14-47-00--jobName:cron任务1--jobGroup:任务组名1--triggerName:cron触发器1--triggerGroup:cron触发器组名1--count:8--cron:0/10 * * * * ? *
SignInJob start at:22-04-08 14-47-10--jobName:cron任务1--jobGroup:任务组名1--triggerName:cron触发器1--triggerGroup:cron触发器组名1--count:9--cron:0/10 * * * * ? *
SignInJob start at:22-04-08 14-47-20--jobName:cron任务1--jobGroup:任务组名1--triggerName:cron触发器1--triggerGroup:cron触发器组名1--count:10--cron:0/10 * * * * ? *

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-04-09 18:09:53  更:2022-04-09 18:12:18 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 5:22:32-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码