行业资讯 2025年08月6日
0 收藏 0 点赞 666 浏览 3364 个字
摘要 :

文章目录 一、导入依赖包 二、创建job 三、创建调度器 四、启动测试 五、总结 最近有个同学咨询关于Quartz框架定时任务的问题,但他不是使用的cron方式实现指定时间间……




  • 一、导入依赖包
  • 二、创建job
  • 三、创建调度器
  • 四、启动测试
  • 五、总结

最近有个同学咨询关于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指定时间的间隔实现

注意:当到结束时间时,虽然job不会再执行了,但是scheduler调度器线程并没有停止,而是一直在运行(可能是阻塞状态),所以主程序也不会结束,如果想要结束线程可以使用scheduler.shutdown();方法实现,但千万别再scheduler.start();直接使用shutdown否则线程立马关闭,导致定时任务不会执行,可以在start之后shutdown之前,让Thread.sleep(大于等于定时任务时间段时长)

五、总结

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

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

微信扫一扫

支付宝扫一扫

版权: 转载请注明出处:https://www.zuozi.net/8094.html

管理员

相关推荐
2025-08-06

文章目录 一、Reader 接口概述 1.1 什么是 Reader 接口? 1.2 Reader 与 InputStream 的区别 1.3 …

988
2025-08-06

文章目录 一、事件溯源 (一)核心概念 (二)Kafka与Golang的优势 (三)完整代码实现 二、命令…

465
2025-08-06

文章目录 一、证明GC期间执行native函数的线程仍在运行 二、native线程操作Java对象的影响及处理方…

348
2025-08-06

文章目录 一、事务基础概念 二、MyBatis事务管理机制 (一)JDBC原生事务管理(JdbcTransaction)…

456
2025-08-06

文章目录 一、SnowFlake算法核心原理 二、SnowFlake算法工作流程详解 三、SnowFlake算法的Java代码…

517
2025-08-06

文章目录 一、本地Jar包的加载操作 二、本地Class的加载方法 三、远程Jar包的加载方式 你知道Groo…

832
发表评论
暂无评论

还没有评论呢,快来抢沙发~

助力内容变现

将您的收入提升到一个新的水平

点击联系客服

在线时间:08:00-23:00

客服QQ

122325244

客服电话

400-888-8888

客服邮箱

122325244@qq.com

扫描二维码

关注微信客服号