定时任务框架quartz的简单使用

一.缘由:

毕设是校园论坛管理系统,首页有个校园新闻的轮播图,想着这个学校官网首页不也有轮播图吗?直接把官网的轮播图弄到我的校园论坛管理系统就行了啊!!!(我可真机智😄).

学校首页.jpg在这里插入图片描述
爬过来就是我的了.jpg

在这里插入图片描述
于是我写了爬取校园首页轮播图的代码,每次访问首页都会去爬取一次.
可是后来一想,这样效率太低,不符合我的身份(实属装逼😄),于是用上quartz定时任务框架每天1:00去爬取一次,然后放到redis中进行缓存.

二.quartz框架简介

  Quartz是功能强大的开源作业调度库,几乎可以集成到任何Java应用程序中-从最小的独立应用程序到最大的电子商务系统。Quartz可用于创建简单或复杂的计划,以执行数以万计,数以万计的工作;任务定义为标准Java组件的作业,它们实际上可以执行您可以编写的所有内容。Quartz Scheduler包含许多企业级功能,例如对JTA事务和集群的支持。

Quartz是免费使用的,并根据Apache 2.0许可获得许可。

在这里插入图片描述

三.quartz的2个简单demo

1.每两秒打印一下hello
2.每天1:00打印一下hello

①.新建maven工程,导入quartz依赖

pom.xml

<!-- https://mvnrepository.com/artifact/org.quartz-scheduler/quartz -->
        <dependency>
            <groupId>org.quartz-scheduler</groupId>
            <artifactId>quartz</artifactId>
            <version>2.2.2</version>
        </dependency>
②.新建具体Job类实现Job接口并重写execute方法.

HelloJob.java

/**
 * 编写具体实现的任务
 */
public class HelloJob implements Job {
    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
        //job执行的时间
        Date date = new Date();
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println("job execute time: " + simpleDateFormat.format(date));
        //具体的业务逻辑
        System.out.println("hello");
    }
}
③.demo1:使用SimpleScheduler进行调度实现每2秒打印一次hello

SimpleTrigger可以实现在一个指定时间段内执行一次作业任务或一个时间段内多次执行作业任务。

HelloScheduler.java

/**
 * 具体触发任务
 */
public class HelloScheduler {
    public static void main(String[] args) throws SchedulerException {
        //创建JobDetail实例,该实例与Job绑定
        JobDetail jobDetail = JobBuilder
                .newJob(HelloJob.class)
                .withIdentity("myJob")
                .build();
        //创建Trigger触发器实例(SimpleSchedule),定义job立即执行,并且每两秒执行一次,一直执行
        SimpleTrigger trigger = TriggerBuilder
                .newTrigger()
                .withIdentity("myTrigger")
                .startNow()
                .withSchedule(SimpleScheduleBuilder
                        .simpleSchedule()
                        .withIntervalInSeconds(2)
                        .repeatForever())
                .build();
        //创建scheduler实例
        StdSchedulerFactory factory = new StdSchedulerFactory();
        Scheduler scheduler = factory.getScheduler();
        scheduler.start();
        scheduler.scheduleJob(jobDetail, trigger);
    }
}

在这里插入图片描述

④.demo2:使用CronScheduler进行调度实现每天1点打印hello

CronTrigger功能非常强大,是基于日历的作业调度,而SimpleTrigger是精准指定间隔,所以相比SimpleTrigger,CroTrigger更加常用。CroTrigger是基于Cron表达式的.

HelloCronScheduler.java

/**
 * 具体触发任务
 */
public class HelloCronScheduler {
    public static void main(String[] args) throws SchedulerException {
        //创建JobDetail实例,该实例与Job绑定
    JobDetail jobDetail = JobBuilder
            .newJob(HelloJob.class)
            .withIdentity("myJob")
            .build();
    //创建CronTrigger触发器实例,定义job每天1:00执行一次
    CronTrigger trigger = TriggerBuilder
            .newTrigger()
            .withIdentity("myTrigger")
            .startNow()
            //Cron表达式
            .withSchedule(CronScheduleBuilder
                    .cronSchedule("0 0 1 * * ?")
            )
            .build();
    //创建scheduler实例
    StdSchedulerFactory factory = new StdSchedulerFactory();
    Scheduler scheduler = factory.getScheduler();
        scheduler.start();
        scheduler.scheduleJob(jobDetail, trigger);
}
}

常用Cron表达式
在这里插入图片描述
在线Cron表达式生成网站:http://cron.qqe2.com/

四.我在毕设中如何使用的quartz

在这里插入图片描述

1.后端基于Springboot,所以导入spring-boot-starter-quartz

pom.xml

<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-quartz -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-quartz</artifactId>
            <version>2.2.4.RELEASE</version>
        </dependency>
2.SpiderJob中执行爬虫,获得首页图片地址然后存到redis数据库中

SpiderJob.java

@Slf4j
public class SpiderJob implements Job {
    @Autowired
    private RedisService redisService;

    @Override
    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
        //job执行的时间
        Date date = new Date();
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        log.info("job execute time: " + simpleDateFormat.format(date));
        //具体的业务逻辑
        //开启爬虫爬取https://www.sdju.edu.cn首页图片地址并存到redis数据库
        String jsonString = SpiderUtil.getIndexNews();
        redisService.set("spider:name:news", jsonString);
    }
}
3.SpiderJobScheduler执行调度,Scheduler可以直接注入进去

SpiderJobScheduler.java

@Configuration
public class SpiderJobScheduler {
    @Autowired
    private Scheduler scheduler;

    public void startSpiderJob() throws SchedulerException {
        //创建JobDetail实例,该实例与Job绑定
        JobDetail jobDetail = JobBuilder
                .newJob(SpiderJob.class)
                .withIdentity("spiderJob")
                .build();
        //创建CronTrigger触发器实例,定义job每天1:00执行一次
        CronTrigger trigger = TriggerBuilder
                .newTrigger()
                .withIdentity("spiderTrigger")
                .startNow()
                .withSchedule(CronScheduleBuilder
                        .cronSchedule("0 0 1 * * ?")
                )
                .build();
        //创建scheduler实例
        StdSchedulerFactory factory = new StdSchedulerFactory();
        scheduler.start();
        scheduler.scheduleJob(jobDetail, trigger);
    }
}
4.Controller中相关代码
@GetMapping(Api.INDEX_NEWS)
    @ApiOperation(value = "获取首页轮播图图片地址")
    public Result showIndexNews() {
        String jsonString = redisService.get("spider:name:news");
        if (jsonString == null) {//如果redis中没有,则直接通过爬虫获取
            log.info("redis key null");
            jsonString = SpiderUtil.getIndexNews();
            redisService.set("spider:name:news", jsonString);
        }
        JSONArray jsonArray = JSONArray.parseArray(jsonString);
        return Result.success().add("news", jsonArray);
    }
5.很重要的一步:我们之前的demo中启动quartz是放在main函数中的,而现在我希望能够在程序启动的时候就启动quartz.方法就是实现ApplicationListener接口,监听内置事件ContextRefreshedEvent.

理解 Spring ApplicationListener

QuartzListener.java

@Slf4j
@Configuration
public class QuartzListener implements ApplicationListener<ContextRefreshedEvent> {
    @Autowired
    private SpiderJobScheduler scheduler;

    @Override
    public void onApplicationEvent(ContextRefreshedEvent contextRefreshedEvent) {
        log.info("===========启动============");
        try {
            //每天1点启动爬虫更新
            scheduler.startSpiderJob();
        } catch (SchedulerException e) {
            e.printStackTrace();
        }
    }
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Selenium399

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值