Quartz定时任务通过SimpleTrigger指定时间的间隔实现

Java技术 潘老师 3年前 (2021-09-07) 1948 ℃ (0) 扫码查看

最近有个同学咨询关于Quartz框架定时任务的问题,但他不是使用的cron方式实现指定时间间隔执行某个代码逻辑,而是使用的是SimpleTrigger的方式来实现的。之前潘老师也只用过cron注解配置的方式实现过,SimpleTrigger定时执行某个方法还真没试过,但好在最后成功解决了他的bug,因此也趁这个机会整理下关于SimpleTrigger的实现Quartz定时任务的方式。

关于什么是Quartz潘老师就不再此啰嗦了,只说下它不仅可以使用在web项目上,也可以使用在普通java项目上,因此,潘老师就直接在普通java项目上演示SimpleTrigger方式的代码。

一、导入依赖包

首先我们导入Quartz框架的依赖包,具体如下:

<!--quzrtz框架 核心包-->
<dependency>
  <groupId>org.quartz-scheduler</groupId>
  <artifactId>quartz</artifactId>
  <version>2.3.2</version>
</dependency>
<!--工具包 可选-->
<dependency>
  <groupId>org.quartz-scheduler</groupId>
  <artifactId>quartz-jobs</artifactId>
  <version>2.3.2</version>
</dependency>

二、创建job

其次我们要定义好需要定时执行的业务逻辑代码,注意该任务类必须实现Job接口,然后重写execute方法execute方法中就是定时执行的业务代码,这里潘老师定义一个HelloJob类。

package com.panziye;

import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.quartz.Trigger;

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

public class HelloJob implements Job {
    @Override
    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
        // 定时业务逻辑
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
        System.out.println("say hello time: " + sdf.format(new Date()));
        // 其他一些知识,比如获取trigger触发器对象
        Trigger trigger = jobExecutionContext.getTrigger();
        System.out.println("jobKey的名称:" + trigger.getKey().getName());
        System.out.println("jobKey组的名称: " + trigger.getKey().getGroup());
        System.out.println("job 开始时间:" + sdf.format(trigger.getStartTime()));
        System.out.println("job 结束时间: " + sdf.format(trigger.getEndTime()));
        System.out.println("========================================");
    }
}

三、创建调度器

最后我们需要创建调度器,实现定时对job代码进行调度执行,这里潘老师直接就在main方法中来实现:

package com.panziye;

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

import java.util.Date;

public class App {
    public static void main(String[] args) {

        try {
            // 调用
            testSimpleTrigger();
        } catch (SchedulerException e) {
            e.printStackTrace();
        }

    }
    /**
     * 调度器测试
     * 开始时间:当前时间推迟5秒
     * 结束时间:当前时间推迟65秒
     *
     */
    public static void testSimpleTrigger() throws SchedulerException {
        //调度器(Scheduler),从工厂中获取调度实例,
        Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
        // 当前时间
        Date now = new Date();
        //开始时间 startTime 当前时间推迟5秒
        Date startTime = new Date(now.getTime() + 5000);
        //结束时间 endTime 当前时间推迟65秒
        Date endTime = new Date(now.getTime() + 65000);
        //任务实例(JobDetail)
        //构建任务类 完成与HelloJob的绑定 要求 HelloJob必须实现Job接口
        JobDetail jobDetail = JobBuilder.newJob(HelloJob.class)
                //参数1 任务的名称 参数2 任务组的名称
                .withIdentity("job1", "group1")
                //传递参数
                .usingJobData("msg", "jobDetail测试")
                // 构建
                .build();
        // 构建触发器Trigger
        Trigger trigger = TriggerBuilder.newTrigger()
                //参数1 触发器的名称 参数2 触发器组的名称
                .withIdentity("trigger1", "group1")
                // 每隔10秒执行一次,一直执行下去,也可以withRepeatCount指定重复次数
                .withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(10).repeatForever())
                //设置任务的开始时间
                .startAt(startTime)
                //设置任务的结束时间
                .endAt(endTime)
                // 构建
                .build();
        // 将trigger和jobdetail加入这个调度
        scheduler.scheduleJob(jobDetail, trigger);
        //启动调度器 其实是开了一个新的线程
        scheduler.start();
    }
}

四、启动测试

我们启动项目,我们发现等待5s后开始执行job任务,而且每隔10s执行一次,直到到结束时间停止任务,测试效果如下:
Quartz定时任务通过SimpleTrigger指定时间的间隔实现

五、总结

其实在实际开发中通过SimpleTrigger实现Quartz定时任务方式应用的比较少,一般还是cron用的比较多,也更灵活,我当时问那位同学为什么不用cron而用SimpleTrigger,他给出的答案是公司的需求正好有指定开始时间、结束时间、执行次数、每次执行间隔这4个参数,而SimpleTrigger完全符合,所以就选择了SimpleTrigger。

其实说白了SimpleTrigger就是方便我们实现在某个时间段内,按某个频率执行某个业务代码,超过这个时间段就结束任务,在此场景下应用会比较适合。


版权声明:本站文章,如无说明,均为本站原创,转载请注明文章来源。如有侵权,请联系博主删除。
本文链接:https://www.panziye.com/java/3606.html
喜欢 (1)
请潘老师喝杯Coffee吧!】
分享 (0)
用户头像
发表我的评论
取消评论
表情 贴图 签到 代码

Hi,您需要填写昵称和邮箱!

  • 昵称【必填】
  • 邮箱【必填】
  • 网址【可选】