架构搭建记录:定时任务quartz的使用

本文档展示了如何在SpringBoot2.4项目中集成Quartz Scheduler,通过添加、修改、删除和控制定时任务来实现动态任务管理。Quartz API用于创建JobDetail和Trigger,设置Cron表达式以按指定时间执行任务。例如,新增任务`addJob`方法接收任务名、组名、触发器名、触发器组、Job类和Cron表达式作为参数。修改任务时间`modifyJobTime`方法允许调整Cron表达式。此外,还提供了启动所有任务的`startJobs`和关闭所有任务的`shutDownAllJobs`方法。DemoJob类作为示例Job实现,展示了简单的日志输出。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

参考:https://www.quartz-scheduler.org/documentation/quartz-2.3.0/

https://www.quartz-scheduler.org/documentation/quartz-2.3.0/examples/

引用的jar如下(spring boot2.4)

        <dependency>
            <groupId>org.quartz-scheduler</groupId>
            <artifactId>quartz</artifactId>
        </dependency>
        <dependency>
            <groupId>org.quartz-scheduler</groupId>
            <artifactId>quartz-jobs</artifactId>
        </dependency>

创建一个管理器class,定义新增、修改、删除、启动、关闭等操作,实际工作中,根据需要,可以动态对定时任务进行管理

   /**
     * 新增任务
     * 
     * @param jobName 任务名称
     * @param jobGroupName 任务组
     * @param triggerName 触发器
     * @param triggerGroupName 触发器组
     * @param jobClass 需要执行的任务类型
     * @param cron 时间计划
     */
    public static void addjob(String jobName, String jobGroupName, String triggerName,String triggerGroupName, Class jobClass, String cron){
        
        try {
    
            // 任务管理器实例化
            Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
            // job对象
            JobDetail jobDetail = JobBuilder.newJob(jobClass).withIdentity(jobName, jobGroupName).build();
            
            // 任务触发器
            TriggerBuilder<Trigger> triggerBuilder = TriggerBuilder.newTrigger();
            triggerBuilder.withIdentity(triggerName, triggerGroupName);
            triggerBuilder.startNow();
            triggerBuilder.withSchedule(CronScheduleBuilder.cronSchedule(cron));
            
            // 定时器、计划
            CronTrigger cronTrigger = (CronTrigger)triggerBuilder.build();
            scheduler.scheduleJob(jobDetail, cronTrigger);
            
            if(!scheduler.isShutdown()){
                // 启动
                scheduler.start();
            }
        } catch (SchedulerException e) {
            
            log.error("定时任务添加异常" + e.getMessage());
            
            e.printStackTrace();
        }
    }

    /**
     * 修改任务
     * 
     * @param triggerName 触发器
     * @param triggerGroupName 触发器组
     * @param cron 时间计划
     */
    public static void modifyJobTime(String triggerName,String triggerGroupName, String cron){
        
        try {
            
            // 任务管理器实例化
            Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
            
            TriggerKey triggerKey = TriggerKey.triggerKey(triggerName, triggerGroupName);
            CronTrigger trigger = (CronTrigger)scheduler.getTrigger(triggerKey);
            
            if(trigger == null){
                return;
            }
            
            // 旧时间计划
            String oldTime = trigger.getCronExpression();
            
            if(!oldTime.equalsIgnoreCase(cron)){
                
                // 修改时间计划
                TriggerBuilder<Trigger> triggerBuilder = TriggerBuilder.newTrigger();
                
                triggerBuilder.withIdentity(triggerName, triggerGroupName);
                // 立即生效
                triggerBuilder.startNow();
                triggerBuilder.withSchedule(CronScheduleBuilder.cronSchedule(cron));
                trigger = (CronTrigger) triggerBuilder.build();
                
                // 更新时间计划
                scheduler.rescheduleJob(triggerKey, trigger);
            }
        } catch (SchedulerException e) {
            
            log.error("定时任务修改异常" + e.getMessage());
            
            e.printStackTrace();
        }
    }

    /**
     * 删除任务
     * 
     * @param jobName 任务名称
     * @param jobGroupName 任务组
     * @param triggerName 触发器
     * @param triggerGroupName 触发器组
     */
    public static void removeJob(String jobName, String jobGroupName,String triggerName, String triggerGroupName){
        
        try {
            
            // 任务管理器实例化
            Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
            
            // 触发器
            TriggerKey triggerKey = TriggerKey.triggerKey(triggerName, triggerGroupName);
            scheduler.pauseTrigger(triggerKey);
            scheduler.unscheduleJob(triggerKey);
            
            // 删除任务
            scheduler.deleteJob(JobKey.jobKey(jobName,jobGroupName));
            
        } catch (SchedulerException e) {
            
            log.error("定时任务删除异常" + e.getMessage());
            
            e.printStackTrace();
        }
    }

    /**
     * 启动所有定时任务
     */
    public static void startJobs(){
        
        try {
            
            // 任务管理器实例化
            Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
            // 启动
            scheduler.start();
        } catch (SchedulerException e) {
            
            log.error("定时任务启动异常" + e.getMessage());
            
            e.printStackTrace();
        }
    }

    /**
     * 关闭所有的定时任务
     */
    public static void shutDownAllJobs(){
        
        try {
            
            // 任务管理器实例化
            Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
            // 关闭
            scheduler.shutdown();
        } catch (SchedulerException e) {
            
            log.error("定时任务关闭异常" + e.getMessage());
            
            e.printStackTrace();
        }
    }

创建Quartz执行的job:

public class DemoJob implements Job {

    private final Log log = LogFactory.getLog(DemoJob.class);
    
    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException {
        
        log.info("定时任务。。。");
        
    }
}

添加job到Quartz

QuartzManage.addjob("testJob1", "testJobGroup", "testTrigger1", "testTriggerGroup", DemoJob.class, "*/5 * * * * ?");

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值