quartz动态定时任务

我们在开发中经常需要定时任务,比如定期去更新一些信息到文档中整理,删除等,那么我们就需要部署一个quartz的增删改查,实现对任务,以及信息的操作

quartz的动态定时任务的核心就是编写任务,配置触发器,再使用调度工厂去调度这个任务

加上依赖



    org.quartz-scheduler
    quartz
    2.3.2

先实现一下简单的功能如下

实现持续一个月,每天0点打印信息

class MyJob implements Job {
    @Override
    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
        // 在这里编写要执行的任务逻辑
        System.out.println("新的一天");

        // 如果需要在一个月后停止任务,你可以在这里检查时间并调用scheduler的shutdown方法来停止调度器
        if (isOneMonthElapsed()) {
            try {
                Scheduler scheduler = jobExecutionContext.getScheduler();
                scheduler.shutdown(true); // true 表示等待当前任务执行完毕再关闭
            } catch (SchedulerException e) {
                e.printStackTrace();
            }
        }
    }

    // 判断是否已经过了一个月
    private boolean isOneMonthElapsed() {
        // 在这里根据业务逻辑判断是否已经过了一个月
        // 你可以根据需要自定义逻辑
        return false; // 这里示例返回false,你需要实现自己的逻辑
    }
}

之后是配置 

public class MyScheduler {
    public static void main(String[] args) throws SchedulerException {
        // 创建调度器工厂
        SchedulerFactory schedulerFactory = new StdSchedulerFactory();
        Scheduler scheduler = schedulerFactory.getScheduler();

        // 开始调度器
        scheduler.start();

        // 创建一个JobDetail,定义要执行的任务
        JobDetail jobDetail = JobBuilder.newJob(MyJob.class)
                .withIdentity("myJob", "group1")
                .build();

        // 创建一个每天0点触发的触发器
        Calendar startTime = Calendar.getInstance();
        startTime.set(Calendar.HOUR_OF_DAY, 0);
        startTime.set(Calendar.MINUTE, 0);
        startTime.set(Calendar.SECOND, 0);
        startTime.set(Calendar.MILLISECOND, 0);

        Trigger trigger = TriggerBuilder.newTrigger()
                .withIdentity("dailyTrigger", "group1")
                .startAt(startTime.getTime()) // 定义任务开始时间
                .withSchedule(SimpleScheduleBuilder.simpleSchedule()
                        .withIntervalInHours(24)  // 每24小时执行一次
                        .repeatForever()) // 一直重复执行
                .endAt(getEndTime()) // 结束时间为一个月后
                .build();

        // 将任务和触发器注册到调度器
        scheduler.scheduleJob(jobDetail, trigger);
    }

    // 获取一个月后的时间
    private static Date getEndTime() {
        Calendar calendar = Calendar.getInstance();
        calendar.add(Calendar.MONTH, 1); // 增加一个月
        return calendar.getTime();
    }
}

接下来我会讲解各种对象的作用

job:实现这个抽象类只有一个execute,参数是调度(Schedlue)执行时会传入数据

如下图 

841da1f1c2a54fe3935ef1cb0c7b8e4b.png

内部是一些需要定时的逻辑 quartz动态定时任务_第1张图片

到这里任务对象就创建好了

接下来就是使用quartz的调度实现动态定时执行这个任务了 

//创建调度器工厂
SchedulerFactory schedulerFactory = new StdSchedulerFactory();
//创建调度器
Scheduler scheduler = schedulerFactory.getScheduler();

创建调度器工厂如下

quartz动态定时任务_第2张图片

 使用JobBuilder构造器根据MyJob自己的定时任务类构造一个JobDetail对象

为什么不直接使用MyJob进行调度呢,应为JobBuilder每次都会创建一个对象进行调度,不是单例,不会造成线程安全问题

quartz动态定时任务_第3张图片

记得在withIdentity函数内设置任务名称,所属组

之后是创建触发器

quartz动态定时任务_第4张图片

触发器核心有四个参数

开始时间 startAt(startTime.getTime()) 
结束时间 endAt(getEndTime())
重复次数 repeatForever() 一直重复执行 直到结束时间
重复间隔 withIntervalInHours(24)

注意withIdentity这两个参数和上面没啥关系 

创建成功后进行绑定调度器

602c04c783ff49a9afa096af572835bd.png

这样就绑定调度器成功了 

启动和关闭调度器讲解

scheduler.start()
这个方法用于启动 Quartz 调度器,让它开始执行预定的任务
一旦调度器启动,它将按照已定义的触发器和作业来执行任务
调度器启动后,可以随时添加新的作业和触发器,它会根据已有的调度配置继续执行任务

scheduler.shutdown()
这个方法用于关闭 Quartz 调度器,停止任务的执行
调用 scheduler.shutdown() 会终止调度器并释放它所占用的资源,包括线程池等
调度器一旦被关闭,就不能再添加新的任务和触发器,需要重新创建新的调度器对象
在你的代码中,首先调用 scheduler.start() 启动调度器,使其开始执行任务;然后,通过 TimeUnit.MINUTES.sleep(1) 让程序休眠一分钟,等待任务执行;最后,调用 scheduler.shutdown() 来关闭调度器,停止任务的执行;这是一个典型的使用方式,可以控制调度器的生命周期

如果希望在稍后重新启动相同的调度器,需要创建一个新的调度器对象,并重新配置作业和触发器,然后再次调用 scheduler.start();注意,已经调用过 shutdown() 的调度器不能再次启动,需要创建一个新的调度器实例

这样的话就实现了一个简单的quartz动态定时任务了,更多详细的定时请看chatGPT 

实现一个简单的quartz系统可以参考 实现一个简单的quartz系统

你可能感兴趣的:(数据库,java,服务器,spring,spring,boot,maven,servlet)