springBoot中定时任务Quartz的用法

本文详细介绍了如何在项目中配置并使用Quartz定时任务,包括添加依赖、创建自定义Job、配置定时器以及整合Spring框架。同时,展示了如何在Job中注入Spring管理的服务,以及如何配置不同类型的触发器。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、在项目中加入依赖

<!-- Quartz坐标 start -->
        <dependency>
            <groupId>org.quartz-scheduler</groupId>
            <artifactId>quartz</artifactId>
            <version>2.2.1</version>
            <exclusions>
                <exclusion>
                    <artifactId>slf4j-api</artifactId>
                    <groupId>org.slf4j</groupId>
                </exclusion>
            </exclusions>
        </dependency>

        <!-- 添加Scheduled坐标 -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context-support</artifactId>
        </dependency>

        <!-- Sprng tx 坐标 -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-tx</artifactId>
        </dependency>

        <!-- Quartz坐标 end -->

2、创建自己的job1类

package com.cn.quartz;

import com.cn.domain.User;
import com.cn.service.UserService;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.time.LocalDateTime;

/**
 * @ClassName MyJob
 * @Description MyJob
 * @Author RX
 * @Date 2020/4/9 13:25
 * @Version 1.0
 */
@Component
public class MyJob implements Job {
//    @Autowired               为什么不能用自动注入service?注入的为什么为空?
//                              job是在job框架中完成实例化的,service是在spring中创建出来的,job不受spring的管理;
//    UserService userService;
    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException {
        // 获取bean的时候 通过一个实现applicationContextAwa接口的类,通过applicationContext.getBean(beanName)的方法获取;
        User userInfo = ((UserService)ApplicationContextHelper.getBean("userService")).getUserInfo("8");
        System.out.println("执行了myjob1"+userInfo+" 时间"+ LocalDateTime.now().withNano(0));
    }
}

job2

package com.cn.quartz;

import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;

import java.time.LocalDateTime;

/**
 * @ClassName MyJob2
 * @Description MyJob2
 * @Author RX
 * @Date 2020/4/9 13:34
 * @Version 1.0
 */
public class MyJob2 implements Job {
    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException {
        System.out.println("this is myjob2 is excuting  "+ LocalDateTime.now().withNano(0));
    }
}

定时器配置类

package com.cn.quartz;

import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.quartz.CronTriggerFactoryBean;
import org.springframework.scheduling.quartz.JobDetailFactoryBean;
import org.springframework.scheduling.quartz.SchedulerFactoryBean;
import org.springframework.scheduling.quartz.SimpleTriggerFactoryBean;

/**
 * @author rx
 */
@Configuration
public class QuartzConfig {

    /**
     * 将Job1放入JobDetailFactoryBean
     *
     * @return
     */
    @Bean(name = "Job1")
    public JobDetailFactoryBean Job1() {
        JobDetailFactoryBean jobDetailFactory = new JobDetailFactoryBean();
        //关联我们定义的Job类
        jobDetailFactory.setJobClass(MyJob.class);
        return jobDetailFactory;
    }

    @Bean(name = "Job2")
    public JobDetailFactoryBean Job2() {
        JobDetailFactoryBean jobDetailFactoryBean = new JobDetailFactoryBean();
        jobDetailFactoryBean.setJobClass(MyJob2.class);
        return jobDetailFactoryBean;
    }

    /**
     * 设置job1的定时器  类型为简单定时器 SimpleTrigger
     *
     * @param jobDetailFactory
     * @return
     */
    @Bean(name = "cronJob1")
    public SimpleTriggerFactoryBean cronJob1(@Qualifier("Job1") JobDetailFactoryBean jobDetailFactory) {
        SimpleTriggerFactoryBean simpleTriggerFactory = new SimpleTriggerFactoryBean();
        simpleTriggerFactory.setJobDetail(jobDetailFactory.getObject());
        //设置间隔时间
        simpleTriggerFactory.setRepeatInterval(2000);
        //设置重复次数
        simpleTriggerFactory.setRepeatCount(20);
        return simpleTriggerFactory;
    }

    /**
     * 设置job2的定时器  用cron模式
     */
    @Bean(name = "cronJob2")
    public CronTriggerFactoryBean cronJob2(@Qualifier("Job2") JobDetailFactoryBean jobDetailFactoryBean) {
        CronTriggerFactoryBean cronTriggerFactoryBean = new CronTriggerFactoryBean();
        cronTriggerFactoryBean.setJobDetail(jobDetailFactoryBean.getObject());
        cronTriggerFactoryBean.setCronExpression("0/5 * * * * ?");
        return cronTriggerFactoryBean;
    }


    /**
     * 将SimpleTrigger,cornTrigger 分别加入SchedulerFactoryBean
     *
     * @param
     * @return
     */
    @Bean
    public SchedulerFactoryBean schedulerFactoryBean(@Qualifier("cronJob1") SimpleTriggerFactoryBean Job1
            , @Qualifier("cronJob2") CronTriggerFactoryBean Job2) {
        SchedulerFactoryBean schedulerFactory = new SchedulerFactoryBean();
        schedulerFactory.setTriggers(Job1.getObject(), Job2.getObject());//一次可以加多个任务定时器
        return schedulerFactory;
    }
}

创建一个applicationContextHelper类,用于job类中引用service时使用

package com.cn.quartz;

import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;

/**
 * @ClassName ApplicationContextHelper
 * @Description ApplicationContextHelper
 * @Author RX
 * @Date 2020/4/9 14:56
 * @Version 1.0
 */
@Component
public class ApplicationContextHelper implements ApplicationContextAware {
    public static ApplicationContext acx;
    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        this.acx = applicationContext;
    }
    public static Object getBean(String beanName){
        return acx.getBean(beanName);
    }
}

最后开启定时任务---在主启动类上加上注解  @EnableScheduling


 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值