如何对quartz定时任务设置结束时间

 更新时间:2023年12月14日 09:12:08   作者:不喜欢吃猫的鱼  
这篇文章主要介绍了如何对quartz定时任务设置结束时间问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

quartz定时任务设置结束时间

在使用quartz时,使用cornTrigger再设置一个结束时间 endAt(“结束的时间”),实现在任务执后自动销毁任务,在到了结束时间之后,job并不会留在内存中,job是直接被delete掉,所以不担心会有内存满的情况;

代码:

//按新的cronExpression表达式构建一个新的trigger
trigger = TriggerBuilder.newTrigger()
        .withIdentity(triggerName, triggerGroupName)
        .withSchedule(scheduleBuilder)
        .endAt(endDate)
        .build();

附属上查询所有job代码:

/**
 * 查询所有的job
 */
public static void getAllJobs(){
    try {
        Scheduler scheduler = sf.getScheduler();
        for (String groupName : scheduler.getJobGroupNames()) {
            for (JobKey jobKey : scheduler.getJobKeys(GroupMatcher.jobGroupEquals(groupName))) {
                String jobName = jobKey.getName();
                String jobGroup = jobKey.getGroup();
                //get job's trigger
                List<Trigger> triggers = (List<Trigger>) scheduler.getTriggersOfJob(jobKey);
                Date nextFireTime = triggers.get(0).getNextFireTime();
                System.out.println("[jobName] : " + jobName + " [groupName] : "
                        + jobGroup + " - " + nextFireTime);
            }
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}

下面是完整的quartz工具类

import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;
import org.quartz.impl.matchers.GroupMatcher;
import qgs.framework.core.task.JobFactory;
import qgs.framework.util.utilty.DateUtil;

import java.text.ParseException;
import java.util.Date;
import java.util.List;

/**
 * create by XXX on 2018/09/03
 * 定时任务工具类
 */
public class QuartzUtil {
    private static SchedulerFactory sf = new StdSchedulerFactory();
    private static JobFactory jobFactory = new JobFactory();
    private static String JOB_GROUP_NAME = "group1";
    private static String TRIGGER_GROUP_NAME = "trigger1";

    /**
     * 添加一个定时任务,使用默认的任务组名,触发器名,触发器组名
     *
     * @param jobName  任务名
     * @param jobClass 任务类名
     * @param time     时间设置,参考quartz说明文档
     * @param data     定时任务所带参数数据
     * @param endDate  定时任务生命周期结束时间
     * @throws ParseException
     */
    public static void saveJobCron(String jobName, Class<? extends Job> jobClass, String time, JobDataMap data, Date endDate) throws Exception {
        saveJobCron(jobName, JOB_GROUP_NAME, jobName, TRIGGER_GROUP_NAME, jobClass, time, data, endDate);
    }

    /**
     * 添加一个定时任务,使用默认的任务组名,触发器名,触发器组名
     *
     * @param jobName  任务名
     * @param jobClass 任务类名
     * @param time     时间设置,参考quartz说明文档
     * @throws ParseException
     */
    public static void saveJobCron(String jobName, Class<? extends Job> jobClass, String time) throws Exception {
        saveJobCron(jobName, JOB_GROUP_NAME, jobName, TRIGGER_GROUP_NAME, jobClass, time);
    }

    /** */
    /**
     * 添加一个定时任务,使用默认的任务组名,触发器名,触发器组名
     *
     * @param jobName  任务名
     * @param jobClass 任务类名
     * @param time     时间间隔  每隔多少时间执行一次 单位毫秒 如 1000*60*60 = 1小时
     * @throws ParseException
     */
    public static void saveJobSimple(String jobName, Class<? extends Job> jobClass, Integer time) throws Exception {
        saveJobSimple(jobName, JOB_GROUP_NAME, jobName, TRIGGER_GROUP_NAME, jobClass, time, true);
    }

    public static void saveJobSimple(String jobName, Class<? extends Job> jobClass, Integer time, boolean firstRun) throws Exception {
        saveJobSimple(jobName, JOB_GROUP_NAME, jobName, TRIGGER_GROUP_NAME, jobClass, time, firstRun);
    }

    /** */
    /**
     * 添加一个定时任务
     *
     * @param jobName          任务名
     * @param jobGroupName     任务组名
     * @param triggerName      触发器名
     * @param triggerGroupName 触发器组名
     * @param jobClass         任务类名
     * @param time             时间间隔  每隔多少时间执行一次 单位秒 如 1000*60*60 = 1小时
     * @throws SchedulerException
     * @throws ParseException
     * @throws ParseException
     */
    public static void saveJobSimple(String jobName, String jobGroupName, String triggerName,
                                     String triggerGroupName, Class<? extends Job> jobClass, Integer time, boolean firstRun)
            throws Exception {
        Scheduler scheduler = sf.getScheduler();
        scheduler.setJobFactory(jobFactory);

        TriggerKey triggerKey = TriggerKey.triggerKey(jobName, triggerGroupName);
        SimpleTrigger trigger = (SimpleTrigger) scheduler.getTrigger(triggerKey);
        //不存在,创建一个
        if (null == trigger) {
            JobDetail jobDetail = JobBuilder.newJob(jobClass).withIdentity(jobName, jobGroupName).build();
            //按新的cronExpression表达式构建一个新的trigger
            TriggerBuilder s = TriggerBuilder.newTrigger().withIdentity(triggerName, triggerGroupName);
            if (!firstRun) {
                s.startAt(DateUtil.addSecond(new Date(), time));
            }
            trigger = (SimpleTrigger) s.withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(time).repeatForever()).build();
            scheduler.scheduleJob(jobDetail, trigger);
            //启动
            if (!scheduler.isShutdown())
                scheduler.start();
        } else {
            // Trigger已存在,那么更新相应的定时设置
            //按新的cronExpression表达式重新构建trigger
            trigger = trigger.getTriggerBuilder().withIdentity(triggerKey)
                    .withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(time).repeatForever()).build();
            //按新的trigger重新设置job执行
            scheduler.rescheduleJob(triggerKey, trigger);
        }
    }

    /**
     * 添加一个定时任务
     *
     * @param jobName          任务名
     * @param jobGroupName     任务组名
     * @param triggerName      触发器名
     * @param triggerGroupName 触发器组名
     * @param jobClass         任务类名
     * @param time             时间设置,参考quartz说明文档
     * @param data             对应定时认为中所涉及的数据
     * @param endDate          定时任务周期结束时间
     * @throws SchedulerException
     * @throws ParseException
     * @throws ParseException
     */
    public static void saveJobCron(String jobName, String jobGroupName, String triggerName,
                                   String triggerGroupName, Class<? extends Job> jobClass, String time,
                                   JobDataMap data, Date endDate)
            throws Exception {
        Scheduler scheduler = sf.getScheduler();
        scheduler.setJobFactory(jobFactory);

        TriggerKey triggerKey = TriggerKey.triggerKey(jobName, triggerGroupName);
        CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerKey);
        //不存在,创建一个
        if (null == trigger) {
            JobDetail jobDetail =
                    JobBuilder.newJob(jobClass)
                            .withIdentity(jobName, jobGroupName)
                            .setJobData(data)
                            .build();
            //表达式调度构建器
            CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(time);
            //按新的cronExpression表达式构建一个新的trigger
            trigger = TriggerBuilder.newTrigger()
                    .withIdentity(triggerName, triggerGroupName)
                    .withSchedule(scheduleBuilder)
                    .endAt(endDate)
                    .build();
            scheduler.scheduleJob(jobDetail, trigger);
            //启动
            if (!scheduler.isShutdown())
                scheduler.start();
        } else {
            // Trigger已存在,那么更新相应的定时设置
            //表达式调度构建器
            CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(time);
            //按新的cronExpression表达式重新构建trigger
            trigger = trigger.getTriggerBuilder()
                    .withIdentity(triggerKey)
                    .withSchedule(scheduleBuilder)
                    .startAt(new Date())
                    .endAt(endDate).build();
            //按新的trigger重新设置job执行
            scheduler.rescheduleJob(triggerKey, trigger);
        }
    }

    /**
     * 添加一个定时任务
     *
     * @param jobName          任务名
     * @param jobGroupName     任务组名
     * @param triggerName      触发器名
     * @param triggerGroupName 触发器组名
     * @param jobClass         任务类名
     * @param time             时间设置,参考quartz说明文档
     * @throws SchedulerException
     * @throws ParseException
     * @throws ParseException
     */
    public static void saveJobCron(String jobName, String jobGroupName, String triggerName,
                                   String triggerGroupName, Class<? extends Job> jobClass, String time) throws Exception {
        Scheduler scheduler = sf.getScheduler();
        scheduler.setJobFactory(jobFactory);

        TriggerKey triggerKey = TriggerKey.triggerKey(jobName, triggerGroupName);
        CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerKey);
        //不存在,创建一个
        if (null == trigger) {
            JobDetail jobDetail =
                    JobBuilder.newJob(jobClass)
                            .withIdentity(jobName, jobGroupName)
                            .build();
            //表达式调度构建器
            CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(time);
            //按新的cronExpression表达式构建一个新的trigger
            trigger = TriggerBuilder.newTrigger()
                    .withIdentity(triggerName, triggerGroupName)
                    .withSchedule(scheduleBuilder)
                    .build();
            scheduler.scheduleJob(jobDetail, trigger);
            //启动
            if (!scheduler.isShutdown())
                scheduler.start();
        } else {
            // Trigger已存在,那么更新相应的定时设置
            //表达式调度构建器
            CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(time);
            //按新的cronExpression表达式重新构建trigger
            trigger = trigger.getTriggerBuilder().withIdentity(triggerKey)
                    .withSchedule(scheduleBuilder).build();
            //按新的trigger重新设置job执行
            scheduler.rescheduleJob(triggerKey, trigger);
        }
    }

    /** */
    /**
     * 移除一个任务(使用默认的任务组名,触发器名,触发器组名)
     *
     * @param jobName
     * @throws SchedulerException
     */
    public static void removeJob(String jobName) throws Exception {
        removeJob(jobName, JOB_GROUP_NAME, jobName, TRIGGER_GROUP_NAME);
    }

    /** */
    /**
     * 移除一个任务
     *
     * @param jobName
     * @param jobGroupName
     * @param triggerName
     * @param triggerGroupName
     * @throws SchedulerException
     */
    public static void removeJob(String jobName, String jobGroupName, String triggerName,
                                 String triggerGroupName) throws Exception {
        Scheduler scheduler = sf.getScheduler();
        TriggerKey triggerKey = TriggerKey.triggerKey(triggerName, triggerGroupName);
        scheduler.pauseTrigger(triggerKey);// 停止触发器
        scheduler.unscheduleJob(triggerKey);// 移除触发器
        scheduler.deleteJob(JobKey.jobKey(jobName, jobGroupName));// 删除任务
    }

    public static void shutdownJobs() throws Exception {
        Scheduler scheduler = sf.getScheduler();
        try {
            if (!scheduler.isShutdown()) {
                scheduler.shutdown();
            }
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * 查询所有的job
     */
    public static void getAllJobs(){
        try {
            Scheduler scheduler = sf.getScheduler();
            for (String groupName : scheduler.getJobGroupNames()) {
                for (JobKey jobKey : scheduler.getJobKeys(GroupMatcher.jobGroupEquals(groupName))) {
                    String jobName = jobKey.getName();
                    String jobGroup = jobKey.getGroup();
                    //get job's trigger
                    List<Trigger> triggers = (List<Trigger>) scheduler.getTriggersOfJob(jobKey);
                    Date nextFireTime = triggers.get(0).getNextFireTime();
                    System.out.println("[jobName] : " + jobName + " [groupName] : "
                            + jobGroup + " - " + nextFireTime);
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 如何解决 Java 中的 IndexOutOfBoundsException 异常(最新推荐)

    如何解决 Java 中的 IndexOutOfBoundsException 异

    当我们在 Java 中使用 List 的时候,有时候会出现向 List 中不存在的位置设置新元素的情况,从而导致 IndexOutOfBoundsException 异常,本文将会介绍这个问题的产生原因以及解决方案
    2023-10-10
  • 论java如何通过反射获得方法真实参数名及扩展研究

    论java如何通过反射获得方法真实参数名及扩展研究

    这篇文章主要为大家介绍了java如何通过反射获得方法的真实参数名以及扩展研究,有需要的朋友可以借鉴参考下,希望能够有所帮助祝大家多多进步早日升职加薪
    2022-01-01
  • Java实现图片转换PDF文件的示例代码

    Java实现图片转换PDF文件的示例代码

    这篇文章主要介绍了Java实现图片转换PDF文件的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • Java并发编程之阻塞队列深入详解

    Java并发编程之阻塞队列深入详解

    这篇文章主要介绍了详解Java阻塞队列(BlockingQueue)的实现原理,阻塞队列是Java util.concurrent包下重要的数据结构,是一种特殊的队列,需要的朋友可以参考下
    2021-10-10
  • Spring boot Rabbitmq消息防丢失实践

    Spring boot Rabbitmq消息防丢失实践

    这篇文章主要介绍了Spring boot Rabbitmq消息防丢失实践,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-09-09
  • Java堆&优先级队列示例讲解(上)

    Java堆&优先级队列示例讲解(上)

    这篇文章主要通过示例详细为大家介绍Java中的堆以及优先级队列,文中的示例代码讲解详细,对我们了解java有一定帮助,需要的可以参考一下
    2022-03-03
  • SpringBoot启动时自动执行sql脚本的方法步骤

    SpringBoot启动时自动执行sql脚本的方法步骤

    本文主要介绍了SpringBoot启动时自动执行sql脚本的方法步骤,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-09-09
  • 关于Java for循环的正确用法介绍

    关于Java for循环的正确用法介绍

    Java里的循环结构我们可以通过while、do-while、for、foreach等方式实现循环,这篇文章会把这几种循环方式都给大家讲解到,但本文主要介绍for循环的使用,感兴趣的同学可以参考阅读
    2023-05-05
  • JPA like 模糊查询 语法格式解析

    JPA like 模糊查询 语法格式解析

    这篇文章主要介绍了JPA like 模糊查询 语法格式解析,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • Java实现Dijkstra输出最短路径的实例

    Java实现Dijkstra输出最短路径的实例

    这篇文章主要介绍了Java实现Dijkstra输出最短路径的实例的相关资料,希望通过本文能帮助到大家,需要的朋友可以参考下
    2017-09-09

最新评论