基于Quartz实现定时任务-框架学习

Quartz笔记

最近碰到了一个场景,需要能够在指定时间执行任务,比如每周周六周日的3点开启一个服务,那么总不能说,把以后的每个周六周日的日期列出来让程序执行吧,所以就百度了一下找到了这么一个开源框架,Qartz,这个东西上手还是蛮简单的,所以打算记录下来

配置

maven的话,比较容易,就添加上项目依赖就好了

        <!-- https://mvnrepository.com/artifact/org.quartz-scheduler/quartz -->
        <dependency>
            <groupId>org.quartz-scheduler</groupId>
            <artifactId>quartz</artifactId>
            <version>2.2.1</version>
        </dependency>
        <dependency>
            <groupId>org.quartz-scheduler</groupId>
            <artifactId>quartz-jobs</artifactId>
            <version>2.2.1</version>
        </dependency>

emmm,maven仓库能搜到的最新的是2.3.0的,但是官网都没出教程= =所以我还是选择了2.2.1,怂一点总没错,况且需要功能不多。

配置文件

这个比较简单,就在resources文件夹里面放一个名字叫quartz.properties的文件,然后里面写几句话:

org.quartz.scheduler.instanceName = MyScheduler
org.quartz.threadPool.threadCount = 3
org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore

那么第一个就是名字,第二个是最大线程数,就跟那个,线程池一样的东西,第三个是存储方式,他好像是可以把任务存到数据库,也可以存到RAM,我们最终的希望还是存到数据库的,但是RAM是新手教程的方式,所以我就先试试RAM,后面再转JDBC。

运行

这应该是我碰到的最简单的运行方式了

public class Scheduler implements Runnable{

    private static org.quartz.Scheduler scheduler;

    @Override
    public void run() {
        try {
            // Grab the TaskHandler instance from the Factory
            scheduler = StdSchedulerFactory.getDefaultScheduler();

            // and start it off
            scheduler.start();

        } catch (SchedulerException se) {
            se.printStackTrace();
        }
    }
}

获得一个默认的Scheduler,然后start就行了

然后你就能看到这个:
这里写图片描述
就启动完成啦

创建一个任务

他的一个任务是叫做,job,顾名思义,就是任务,比如该咋干活,然后啥的,主要是一个任务流程问题,那么我们看一下内部。

public interface Job {
    void execute(JobExecutionContext var1) throws JobExecutionException;
}

内部非常简单,一个execute就行啦,所以我们需要做的,就是实现这个任务


public class MyJob implements Job {

    @Override
    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
        System.out.println("fin's job");
    }
}

我们就创建了一个job,那么当要执行这个任务的时候,就会执行execute了!所以说我们只需要定义好这个execute,就能正确执行我们想要的东西了。

那么这个job怎么放到任务里,他有个builder模式,名称为org.quartz.JobBuilder,那么我们可以通过这个来构造一个job

 JobDetail jobDetail = JobBuilder.newJob(MyJob.class).build();

JobDetail就是我们需要执行的一个任务了,他是通过JobBuilder类的newJob静态方法,将我们实例化的Job给构建出来,然后build后生成我们需要的JobDetail对象。

Job传值

job的builder可以使用usingJobData方法来进行传值,那么这个东西在框架中被称作:JobDataMap,还是很明显,意思是任务数据map,usingJobData可以理解成Map.put(),前面是key,后面是value。

JobDetail jobDetail = JobBuilder.newJob(MyJob.class)
    .usingJobData("name","finQQ")
    .build();

那么我们怎么获得这个值。

只需要这句话:

        Map map = jobExecutionContext.getJobDetail().getJobDataMap();
        System.out.println(map.get("name") + "'s job");

这样就获得了我们需要的数据。同样,builder里面还有很多函数可以供我们选择。

触发器

刚刚Job是做什么,那么Trigger就是什么时候做,我们最需要的就是这个Trigger

创建Trigger也是通过所谓的TriggerBuilder来建立

Trigger trigger = TriggerBuilder.newTrigger()
    .startNow()
     .withSchedule(simpleSchedule()
         .withIntervalInSeconds(40)
         .repeatForever())
     .build();

上面就是创建一个触发器。

  • startNow 现在开始
  • withSchedule 日程表,这个就是决定我们什么时候做什么的,有SimpleSchedule还有CronSchedule,这个就是创建一个每40秒循环一次然后循环到死的普通日程表
  • build 构建开始

Schedule

Cronschedule应该是我需要的那种,所以晚点会专门研究一下。。

最后一步

添加我们的job和trigger到工作区

scheduler.scheduleJob(jobDetail, trigger);

效果

这里写图片描述

可以看到,每隔40秒就打印出了一个消息,下一篇我会根据实际应用写一下我的使用

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值