为了账号安全,请及时绑定邮箱和手机立即绑定

spring boot 集成quartz(使用spring boot、quartz)

标签:
Java SpringBoot

一直使用spring boot 和quartz ,从来没做过总结,现在总结一下,同时让自己重新学习,并想跟大家分享,处女作,有什么不规范的请大家多留言交流。

一、使用工具及框架

idea 2017.3,spring boot,quartz

二、创建项目

1.spring boot项目 (直接访问http://start.spring.io/也可以自动用生成,本文使用idea)

1.1 file->new->project

图片描述

1.2 选择next,见到下图

图片描述

按照说明填写自己的项目信息,然后点next

1.3 选择适合自己项目依赖,本项目选择web项目,选择一些模板
图片描述

1.4 一直下一步,创建完成

打开已经创建好的模块,发现spring boot会自动生成一个启动类,并有一个main函数,点击启动

图片描述

启动之后可以看到如下日志,jvm running for xxx表示项目可以启动,默认是8080端口," Tomcat started on port(s): 8080 (http) with context path "表示启动的端口号,或者访问127.0.0.1:8080,如果不报连接拒绝则代表可以正常访问
图片描述

2 集成quartz,使用quartz,就要理解里面的声明
scheduler:任务调度器
trigger:任务触发器,用于定义任务调度时间规则
job:待执行的任务,即被调度的任务
misfire:没有启动,指本应该被执行但实际没有被执行的任务调度

2.1首先在pom文件加上quartz依赖,将下面maven依赖添加到 dependencies节点里面

<!-- quartz 使用了该jar包PlatformTransactionManager类 -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-tx</artifactId>
</dependency>
<!-- 该依赖里面有spring对schedule的支持 -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context-support</artifactId>
</dependency>
<dependency> 
    <groupId>org.quartz-scheduler</groupId>
    <artifactId>quartz</artifactId>
    <version>2.2.1</version>
</dependency>

添加之后如下,点击Import Changes导入jar包

图片描述

2.2 配置定时器
一般spring常用的定时任务框架有:
2.2.1 Spring Schedule 这是spring自带的任务框架 优点就是配置简单,依赖少,缺点就是
同一个task,如果前一个还没跑完后面一个就不会触发,不同的task也不能同时运行。因为scheduler的默认线程数为1,配置pool-size为2的话,会导致同一个task前一个还没跑完后面又被触发的问题,不支持集群等。想了解的同学可以看下面代码

package com.imooc.quartz.task;

import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import java.util.Date;

/**
 * spring自带任务框架,有弊端
 */
@Component
@EnableScheduling //必须加噢
public class SpringScheduleTask {

    /**
     *  每分钟执行一次
     */
    @Scheduled(cron = "0 0/1 * * * ?")
    public void reptilian(){
        System.out.println("执行调度任务:"+new Date());
    }
}

2.2.2 Quartz 优点太多了,最主要有负载均衡,容错率高等特点,具体可以参考别人的分享
使首先先要创建一个任务调度器,触发器等 代码如下

package com.imooc.quartz.config;

import com.imooc.quartz.task.QuartzTask;
import org.quartz.JobDetail;
import org.quartz.Trigger;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.quartz.CronTriggerFactoryBean;
import org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean;
import org.springframework.scheduling.quartz.SchedulerFactoryBean;

/**
 * 配置任务
 */
@Configuration
public class QuartzConfiguration {

    /**
     *  配置任务
     * @param quartzTask QuartzTask为需要执行的任务
     * @return
     */
    @Bean(name = "reptilianJob")
    public MethodInvokingJobDetailFactoryBean detailFactoryBean(QuartzTask quartzTask) {

        MethodInvokingJobDetailFactoryBean jobDetail = new MethodInvokingJobDetailFactoryBean();

        // 是否并发执行
        jobDetail.setConcurrent(false);

        // 设置任务的名字
        jobDetail.setName("reptilianJob");

        // 设置任务的分组,在多任务的时候使用
        jobDetail.setGroup("reptilianJobGroup");

        // 需要执行的对象
        jobDetail.setTargetObject(quartzTask);

        /*
         * TODO  非常重要
         * 执行QuartzTask类中的需要执行方法
         */
        jobDetail.setTargetMethod("reptilian");
        return jobDetail;
    }

    /**
     * 定时触发器
     * @param reptilianJob 任务
     * @return
     */
    @Bean(name = "jobTrigger")
    public CronTriggerFactoryBean cronJobTrigger(JobDetail reptilianJob){

        CronTriggerFactoryBean tigger = new CronTriggerFactoryBean();

        tigger.setJobDetail(reptilianJob);

        //cron表达式,每1分钟执行一次
        tigger.setCronExpression("0 0/1 * * * ?");
        tigger.setName("reptilianTrigger");
        return tigger;
    }

    /**
     * 调度工厂
     * @param jobTrigger 触发器
     * @return
     */
    @Bean(name = "scheduler")
    public SchedulerFactoryBean schedulerFactory(Trigger jobTrigger) {

        SchedulerFactoryBean factoryBean = new SchedulerFactoryBean();

        // 用于quartz集群,QuartzScheduler 启动时更新己存在的Job
        factoryBean.setOverwriteExistingJobs(true);

        // 延时启动,应用启动1秒后
        factoryBean.setStartupDelay(1);

        // 注册触发器
        factoryBean.setTriggers(jobTrigger);
        return factoryBean;
    }

}

创建需要执行的业务逻辑类

package com.imooc.quartz.task;

import org.springframework.stereotype.Service;

import java.util.Date;

/**
 * 使用quartz框架
 */
@Service
public class QuartzTask {

    /**
     * 业务逻辑
     */
    public void reptilian(){
        System.out.println("执行业务处理逻辑:"+new Date());
    }
}

最后结果图如下

图片描述

本文章抛砖引玉,大家有什么见解可以留言,谢谢

点击查看更多内容
8人点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消