Springboot集成Quartz实现定时任务代码实例

 更新时间:2023年09月20日 10:39:57   作者:CD4356  
这篇文章主要介绍了Springboot集成Quartz实现定时任务代码实例,任务是有可能并发执行的,若Scheduler直接使用Job,就会存在对同一个Job实例并发访问的问题,而JobDetail & Job方式,Scheduler都会根据JobDetail创建一个新的Job实例,这样就可以规避并发访问问题

Springboot集成Quartz实现定时任务代码实例

Quartz是一款功能强大的任务调度器,Quartz有两个比较核心的组件:Job 和 Trigger。

Quartz的三个基本要素

  • Scheduler:调度器,所有的调度都是由它来控制。
  • Trigger:触发器,决定什么时候执行任务
  • JobDetail & Job:JobDetail定义的是任务数据,而真正执行逻辑是在Job中。任务是有可能并发执行的,若Scheduler直接使用Job,就会存在对同一个Job实例并发访问的问题。而JobDetail & Job方式,Scheduler都会根据JobDetail创建一个新的Job实例,这样就可以规避并发访问问题

Spring Boot自带定时任务,默认是单线程

1. 使用spring boot自带定时任务无需添加相关依赖包

2. 在启动类上添加 @EnableScheduling 注解

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableScheduling;
@SpringBootApplication
@EnableScheduling
public class O2o2Application {
    public static void main(String[] args) {
        SpringApplication.run(O2o2Application.class, args);
        System.out.println("项目启动成功!");
    }
}

3. 在方法上标注 @Scheduled 注解,指定该方法作为定时任务运行的方法。并通过cron属性设置cron表达式,来指定定时任务的执行时间

import com.cd.o2o2.dao.ProductSellDailyDao;
import com.cd.o2o2.service.ProductSellDailyService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;
import java.text.SimpleDateFormat;
import java.util.Date;
@Service("productSellDailyService")
public class ProductSellDailyServiceImpl implements ProductSellDailyService {
	@Override
    @Scheduled(cron = "0/2 * * * * ?") //定时任务运行的方法
    public void demo1() {
        SimpleDateFormat dataFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println(dataFormat.format(new Date()) + "  Quartz Running!");
    }
	@Override
    @Scheduled(cron = "0/5 * * * * ?") //定时任务运行的方法
    public void demo2() {
        SimpleDateFormat dataFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println("\n当前执行时间: " + dataFormat.format(new Date()) + "\n");
    }
}

启动SpringBoot,查看控制台打印信息! demo1()每2秒定时运行一次,demo2()每5秒定时运行一次 cd4356

如果不想使用Spring Boot自带的定时任务,则需要添加quartz相关依赖包

pom.xml

<!--定时组件-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-quartz</artifactId>
</dependency>

Quartz配置类(Job的定义有两种方式,分别为JobDetailFactoryBean和MethodInvokingJobDetailFactoryBean,下面使用MethodInvokingJobDetailFactoryBean类来定义job)

package com.cd.o2o2.config.quartz;
import com.cd.o2o2.service.ProductSellDailyService;
import org.springframework.beans.factory.annotation.Autowired;
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 //标注@Configuration的类,相当于一个xml配置文件
public class QuartzConfiguration {
    @Autowired
    private ProductSellDailyService productSellDailyService;
    @Autowired
    private MethodInvokingJobDetailFactoryBean jobDetailFactory;
    @Autowired
    private CronTriggerFactoryBean cronTriggerFactory;
    /**
     * 配置jobDetail作业类
     * @return
     */
    @Bean(name = "jobDetailFactory") //标注@Bean后表明返回对象会被当做一个Bean注册到Spring IoC容器
    public MethodInvokingJobDetailFactoryBean createJobDetail(){
        MethodInvokingJobDetailFactoryBean jobDetailFactoryBean = new MethodInvokingJobDetailFactoryBean();
        //指定任务名称
        jobDetailFactoryBean.setName("product_sell_daily_job");
        //指定组名称
        jobDetailFactoryBean.setGroup("job_product_sell_daily_group");
        /*
          对于同一个JobDetail,当指定多个trigger时,很可能第一个job完成之前,第二个job就开始了
          指定concurrent属性为false,多个job就会串行执行,而不会并发执行,即第一个job完成前,第二个job不会开启
         */
        jobDetailFactoryBean.setConcurrent(false);
        //指定具体的job任务类
        jobDetailFactoryBean.setTargetObject(productSellDailyService);
        //指定运行任务的方法
        jobDetailFactoryBean.setTargetMethod("dailyCalculate");
        return jobDetailFactoryBean;
    }
    /**
     * 配置cronTrigger触发器(作业调度的方式)
     * @return
     */
    @Bean(name = "cronTriggerFactory")
    public CronTriggerFactoryBean createProductSellDailyTrigger(){
        CronTriggerFactoryBean triggerFactory = new CronTriggerFactoryBean();
        //指定trigger的名称
        triggerFactory.setName("product_sell_daily_trigger");
        //指定trigger的组名
        triggerFactory.setGroup("job_product_sell_daily_group");
        //指定trigger绑定的job
        triggerFactory.setJobDetail(jobDetailFactory.getObject());
        //设置cron表达式,每天凌晨定时运行(通过在线Cron表达式生成器来生成)
        triggerFactory.setCronExpression("0/2 * * * * ?");
        return triggerFactory;
    }
    /**
     * 配置scheduler调度工厂
     * @return
     */
    @Bean
    public SchedulerFactoryBean createScheduler(){
        SchedulerFactoryBean schedulerFactory = new SchedulerFactoryBean();
        //绑定cronTrigger
        schedulerFactory.setTriggers(cronTriggerFactory.getObject());
        return schedulerFactory;
    }
}

dailyCalculate()方法,是定时任务运行的方法

package com.cd.o2o2.service.impl;
import com.cd.o2o2.service.ProductSellDailyService;
import org.springframework.stereotype.Service;
import java.util.Date;
@Service("productSellDailyService")
public class ProductSellDailyServiceImpl implements ProductSellDailyService {
    /**
     * 定时任务运行的方法
     */
    @Override
    public void dailyCalculate() {
        System.out.println(new Date()+": Quartz Running!");
    }
}

启动SpringBoot,查看控制台打印信息!dailyCalculate()方法每2秒定时运行一次

cd4356

Cron表达式示例

cd4356

到此这篇关于Springboot集成Quartz实现定时任务代码实例的文章就介绍到这了,更多相关Springboot定时任务内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java中关于char类型变量能够输出中文的问题

    Java中关于char类型变量能够输出中文的问题

    这篇文章主要介绍了Java中关于char类型变量能够输出中文的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-12-12
  • Java学习关于循环和数组练习题整理

    Java学习关于循环和数组练习题整理

    在本篇文章里小编给各位整理了关于Java学习关于循环和数组练习题相关内容,有兴趣的朋友们跟着参考学习下。
    2019-07-07
  • Java抽象类和接口使用梳理

    Java抽象类和接口使用梳理

    对于面向对象编程来说,抽象是它的一大特征之一,在 Java 中可以通过两种形式来体现OOP的抽象:接口和抽象类,下面这篇文章主要给大家介绍了关于Java入门基础之抽象类与接口的相关资料,需要的朋友可以参考下
    2022-02-02
  • Java原子类中的AtomicInteger类详解

    Java原子类中的AtomicInteger类详解

    这篇文章主要介绍了Java原子类中的AtomicInteger类详解,原子类可以保证对"变量"操作的,原子性、有序性、可见性,我们可以通过AtomicInteger类,来看看它们是怎样工作的,需要的朋友可以参考下
    2023-10-10
  • 如何在Spring中使用编码方式动态配置Bean详解

    如何在Spring中使用编码方式动态配置Bean详解

    这篇文章主要给大家介绍了关于如何在Spring中使用编码方式动态配置Bean的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-05-05
  • Java接口RandomAccess全面了解

    Java接口RandomAccess全面了解

    下面小编就为大家带来一篇Java接口RandomAccess全面了解。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-09-09
  • 什么情况下会出现java.io.IOException : Broken pipe这个错误以及解决办法

    什么情况下会出现java.io.IOException : Broken pipe这个错误以及解决办法

    这篇文章主要介绍了什么情况下会出现java.io.IOException : Broken pipe这个错误以及解决办法的相关资料,这个错误表示通信另一端已关闭连接,常发生在客户端关闭连接、网络超时或资源不足等情况,文中将解决办法介绍的非常详细,需要的朋友可以参考下
    2024-10-10
  • Java的反射机制之获取class详解

    Java的反射机制之获取class详解

    这篇文章主要介绍了Java的反射机制之获取class详解,Class类表示一个类或接口的元数据,通过它可以获取到类或接口的构造函数、方法、字段、注解等信息,也能够创建对象、调用方法等,需要的朋友可以参考下
    2023-09-09
  • Reactive反应式编程及使用介绍

    Reactive反应式编程及使用介绍

    这篇文章主要介绍了为什使用Reactive反应式编程的原因分析,有需要的朋友可以借鉴参考下,希望能够有所帮助祝大家多多进步,早日升职加薪
    2022-02-02
  • SpringBoot应用部署之WAR包部署方式

    SpringBoot应用部署之WAR包部署方式

    这篇文章主要介绍了SpringBoot应用部署之WAR包部署方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-03-03

最新评论