如何使用quartz实现动态定时任务

如何在spring项目中使用quartz定时任务

先说一下起因:为什么我会接触到quartz?

这是几天前的事了,我在QQ群里认识了哥们,他有一个问题没有搞定,然后我通过远程帮他搞定了,从那以后我们也就认识了,自从帮那个哥们解决完那个问题以后,他就一直在弄一个定时任务的东西,一直问我,但是那几天我比较忙,一直在忙自己公司的东西也就没有时间回复他消息,但是过了一周了,那个小哥还在问我quartz的问题…让我远程控制他给他看一下,由于我公司的网不行实在不愿意给别人看代码,我说我帮你写一个吧…

我眼中的定时任务,如下图
我眼中的定时任务

写代码之前的思考

我们主要分析一下,这种定时任务在后台管理系统中是最常见的,这就是定时任务增删改查新增任务,删除任务,暂停任务,恢复任务,修改任务等一系列的操作,根绝需求我们挨个的写出来,首先是新增。

分析代码流程

我们分析一下,所谓定时任务,就是定时去执行任务,首先首要的要素就是要有一个任务,所以我们要有一个任务类,然后我们选择quartz的定时功能来实现对任务类的执行,quartz翻译过来就是石英,明面上的意思已经很明白了,它就是一个对石英表功能的一个实现,钟表有什么功能呢,就是到点就会鸣钟,也就是一个定时任务,但是我觉得quartz比作闹钟会更加贴切,闹钟的任务就是到了你设定的时间就会响铃,现在有些手机可以定时开关机了,响铃和开关机就是定时任务要做的任务不是嘛?和我们要实现的功能是一样的,如果您理解了就请往下看。

创建一个任务类SampleParamJob.java

定时任务定时任务,quartz只给我们实现了定时执行任务的功能,执行什么任务呢?当然由我们自己开写代码咯!
我们的自定义任务类需要实现quartz的Job接口

/**
 * 示例带参定时任务
 *
 * @author Yancary
 */
@Slf4j
public class SampleParamJob implements Job {

    /**
     * 若参数变量名修改 QuartzJobController中也需对应修改
     */
    private String parameter;

    public void setParameter(String parameter) {
        this.parameter = parameter;
    }

    @Override
    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
        log.info(String.format("接收到的参数是 %s! :" + LocalDate.now(), this.parameter));
    }
}
有了要执行的任务我们来写新增定时任务

新增定时任务方法写完了,但是quartz希望我们传一个任务类,这也就解释了为什么我们自定义的任务类需要实现quartz的Job接口了,然后我们需要再写一个工具方法getClass()

  /**
     * 添加定时任务
     *
     * @param jobClassName
     * @param cronExpression
     * @param parameter
     */
    public void add(String jobClassName, String cronExpression, String parameter) {

        try {
            // 启动调度器
            scheduler.start();

            //构建job信息
            JobDetail jobDetail = JobBuilder.newJob(getClass(jobClassName).getClass())
                    .withIdentity(jobClassName)
                    .usingJobData("parameter", parameter)
                    .build();

            //表达式调度构建器(即任务执行的时间) 使用withMisfireHandlingInstructionDoNothing() 忽略掉调度暂停过程中没有执行的调度
            CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(cronExpression).withMisfireHandlingInstructionDoNothing();

            //按新的cronExpression表达式构建一个新的trigger
            CronTrigger trigger = TriggerBuilder.newTrigger().withIdentity(jobClassName)
                    .withSchedule(scheduleBuilder).build();

            scheduler.scheduleJob(jobDetail, trigger);
        } catch (SchedulerException e) {
        } catch (Exception e) {
        }
    }
getClass()方法代码具体实现

这里我就不解释了,通过反射获取任务


    public static Job getClass(String classname) throws Exception {
        Class<?> class1 = Class.forName(classname);
        return (Job) class1.newInstance();
    }
再写一个添加定时任务的测试

我们有了任务也有了定时器,现在就让我们来实现添加一个定时任务的方法吧!

  • 我们再来分析一下代码,定时任务需要的几个参数,第一个就是我们的全类名,上面写了一个方法,就是通过任务类的全类名得到Job类的方法:getClass(),
  • 需要一个cron表达式,下面的代码可以看出,我写的cron表达式的意思是每秒执行一次
  • 最后调用上面写好的add方法来实现定时任务的添加,怎么样是不是感觉很简单呢!?
        QuartzJob job = new QuartzJob();
        job.setJobClassName("cn.soudache.quartzdemo.jobs.SampleParamJob");
        job.setCronExpression("* * * * * ? *");
        job.setParameter("param1");
        add(job.getJobClassName(), job.getCronExpression(), job.getParameter());
后面的废话我们也不多说,写完添加,我们再来写删除,直接上代码!

删除也很简单,全都是quartz提供的接口,我们只需要传一个任务的全类名就行了,非常简单!


    /**
     * 删除定时任务
     *
     * @param jobClassName
     */
    public void delete(String jobClassName) {

        try {
            scheduler.pauseTrigger(TriggerKey.triggerKey(jobClassName));
            scheduler.unscheduleJob(TriggerKey.triggerKey(jobClassName));
            scheduler.deleteJob(JobKey.jobKey(jobClassName));
        } catch (Exception e) {
        }
    }

暂停任务

暂停甚至比删除任务更加简单,代码如下

   void stopJob() throws SchedulerException {
        QuartzJob job = new QuartzJob();
        job.setJobClassName("cn.soudache.quartzdemo.jobs.SampleParamJob");
        scheduler.pauseJob(JobKey.jobKey(job.getJobClassName()));
    }
恢复任务

恢复是暂停相反的功能

void ResetJob() throws SchedulerException {
        QuartzJob job = new QuartzJob();
        job.setJobClassName("cn.soudache.quartzdemo.jobs.SampleParamJob");
        scheduler.resumeJob(JobKey.jobKey(job.getJobClassName()));
    }

我们就写到这里吧,基本上功能都可以实现了,quartz非常的强大,我们写起代码来也非常的简单有木有,如果大家喜欢我的技术博客,别忘了关注我哟~我的代码都会上传到git,大家如果需要,也可以直接去git上面去clone

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值