【第一篇】定时任务之旅(SpringBoot+JPA+BootstrapTable+Quartz实现)

    在Java项目中,定时任务是很常见的,今天我们就来实现一个动态定时任务平台。

    首先简要介绍一下quartz,quartz直接翻译过来就是“石英”的意思。Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,它可以与J2EE与J2SE应用程序相结合也可以单独使用。Quartz可以用来创建简单或为运行十个,百个,甚至是好几万个Jobs这样复杂的程序。Jobs可以做成标准的Java组件或 EJBs。Quartz的最新版本为Quartz 2.3.0。

    更深层次的原理我也讲不太清,如果感兴趣的可以google下。

    介绍完了,现在我们看一下如何简单跑一个任务出来,直接上代码吧:

        //创建一个Scheduler
        Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
        //创建作业
        JobDetail jobDetail = JobBuilder.newJob(TestTask.class)
                .withIdentity("job1","group1")
                .build();
        //创建触发规则
        CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule("0/1 * * * * ? ");
        Trigger trigger = TriggerBuilder.newTrigger()
                .withIdentity("job1","group1")
                .withSchedule(cronScheduleBuilder)
                .build();
        //添加作业与触发规则到scheduler中
        scheduler.scheduleJob(jobDetail,trigger);
        //开始运行
        scheduler.start();

    看来创建一个定时任务也不复杂,关键点有2个,一个是创建作业,也就是JobDetail,JobBuilder.newJob方法传入的参数是一个Class类,这个Class类就是你具体任务的实现类啦,这个类必须实现Job接口,并实现唯一方法execute,也就是说定时任务的业务逻辑统统写在execute方法里面。再看JobBuilder的withIdentity方法,该方法传入两个参数,第一个参数是任务的名称,第二个参数是任务组的名称。这样在以后就可以通过任务名称和任务组名称来查找这个作业了(JobKey jobKey = JobKey.jobKey(scheduleJob.getJobName(),scheduleJob.getJobGroup());)

    再看触发规则的创建,首先需要创建一个机遇cron表达式的触发类,withIdentity方法和前面讲的一样,用于表示具体的触发规则,这样就可以在以后通过任务名称和任务组名称来查找这个触发规则了(TriggerKey triggerKey = TriggerKey.triggerKey(scheduleJob.getJobName(),scheduleJob.getJobGroup());)。然后创建一个CronScheduleBuilder,在CronScheduleBuilder.cronSchedule方法中传入你的cron表达式即可。

    最后通过Scheduler.scheduleJob方法,传入之前定义好的作业类和触发规则即可。

    有一点还是需要提一下的,在这样的一种场景下:假设定时任务已经启动,然后通过在页面上编辑该定时任务,并更新了定时任务的cron表达式,数据更新到数据库中,虽然数据库中的cron表达式已经更新了,但是定时任务中的触发器还是之前的,所以在更新cron表达式的时候,需要同步更新触发器。代码如下:

        //获取TriggerKey
        TriggerKey triggerKey = TriggerKey.triggerKey(scheduleJob.getJobName(),scheduleJob.getJobGroup());
        try {
            //创建触发规则
            CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(scheduleJob.getCronExpression());
            Trigger trigger = TriggerBuilder.newTrigger()
                                .withIdentity(triggerKey)
                                .withSchedule(scheduleBuilder)
                                .startNow()
                                .build();
            scheduler.rescheduleJob(triggerKey,trigger);
        } catch (SchedulerException e) {
            e.printStackTrace();
        }

        还有一点忘记了,那就是maven依赖:

        
            org.quartz-scheduler
            quartz
        

 

你可能感兴趣的:(Spring,Boot)