SpringBoot集成Quartz

本文介绍如何在Spring框架中集成Quartz实现定时任务,包括Job属性注入、工具类设计、配置方法及从数据库读取执行时间。通过具体代码示例,详细展示了自定义Job工厂、触发器和JobDetail的创建过程。

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

1.Job属性注入

public class AutoWiringSpringBeanJobFactory extends SpringBeanJobFactory
        implements ApplicationContextAware {

    private AutowireCapableBeanFactory beanFactory;

    public void setApplicationContext(ApplicationContext applicationContext)
            throws BeansException {
        beanFactory = applicationContext.getAutowireCapableBeanFactory();
    }

    @Override
    protected Object createJobInstance(final TriggerFiredBundle bundle) throws Exception {

        final Object job = super.createJobInstance(bundle);
        //自动装配类相关属性
        beanFactory.autowireBean(job);
        return job;
    }
}

2.Job工具类

public class SchedulerUtil {

    //定时任务Scheduler的工厂类,Quartz提供
    private static StdSchedulerFactory schedulerFactory = new StdSchedulerFactory();
    //CronTrigger的工厂类
    private static CronTriggerFactoryBean factoryBean = new CronTriggerFactoryBean();
    //JobDetail的工厂类
    private static JobDetailFactoryBean jobDetailFactory = new JobDetailFactoryBean();
    //自动注入Spring Bean的工厂类
    private static AutoWiringSpringBeanJobFactory jobFactory =
            new AutoWiringSpringBeanJobFactory();
    //定时任务Scheduler的工厂类,Spring Framework提供
    private static SchedulerFactoryBean schedulerFactoryBean = new SchedulerFactoryBean();

    static {
        //加载指定路径的配置
        schedulerFactoryBean.setConfigLocation(new ClassPathResource("quartz.properties"));
    }

    /**
     * 创建定时任务,根据参数,创建对应的定时任务,并使之生效
     * @param config
     * @param context
     * @return
     */
    public static boolean createScheduler(SysJobConfig config,
                                          ApplicationContext context) {
        try {
            //创建新的定时任务
            return create(config, context);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return false;
    }

    /**
     * 删除旧的定时任务,创建新的定时任务
     * @param oldConfig
     * @param config
     * @param context
     * @return
     */
    public static Boolean modifyScheduler(SysJobConfig oldConfig,SysJobConfig config,
                                          ApplicationContext context) {
        if (oldConfig == null || config == null || context == null) {
            return false;
        }
        try {
            String oldJobClassStr = oldConfig.getFullEntity();
            String oldName = oldJobClassStr + oldConfig.getId();
            String oldGroupName = oldConfig.getGroupName();
            //1、清除旧的定时任务
            delete(oldName, oldGroupName);
            //2、创建新的定时任务
            return create(config, context);
        } catch (SchedulerException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return false;
    }

    /**
     * 提取的删除任务的方法
     * @param oldName
     * @param oldGroupName
     * @return
     * @throws SchedulerException
     */
    public static Boolean delete(String oldName, String oldGroupName)
            throws SchedulerException {
        TriggerKey key = new TriggerKey(oldName, oldGroupName);
        Scheduler oldScheduler = schedulerFactory.getScheduler();
        //根据TriggerKey获取trigger是否存在,如果存在则根据key进行删除操作
        Trigger keyTrigger = oldScheduler.getTrigger(key);
        if (keyTrigger != null) {
            oldScheduler.unscheduleJob(key);
        }
        return true;
    }

    /**
     * 提取出的创建定时任务的方法
     * @param config
     * @param context
     * @return
     */
    public static Boolean create(SysJobConfig config, ApplicationContext context) {
        try {
            //创建新的定时任务
            String jobClassStr = config.getFullEntity();
            Class clazz = Class.forName(jobClassStr);
            String name = jobClassStr + config.getId();
            String groupName = config.getGroupName();
            String description = config.toString();
            String time = config.getCronTime();

            JobDetail jobDetail = createJobDetail(clazz, name, groupName, description);
            if (jobDetail == null) {
                return false;
            }
            Trigger trigger = createCronTrigger(jobDetail,
                    time, name, groupName, description);
            if (trigger == null) {
                return false;
            }

            jobFactory.setApplicationContext(context);

            schedulerFactoryBean.setJobFactory(jobFactory);
            schedulerFactoryBean.setJobDetails(jobDetail);
            schedulerFactoryBean.setTriggers(trigger);
            schedulerFactoryBean.afterPropertiesSet();
            Scheduler scheduler = schedulerFactoryBean.getScheduler();
            if (!scheduler.isShutdown()) {
                scheduler.start();
            }
            return true;
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SchedulerException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return false;
    }

    /**
     * 根据指定的参数,创建JobDetail
     * @param clazz
     * @param name
     * @param groupName
     * @param description
     * @return
     */
    public static JobDetail createJobDetail(Class clazz, String name,
                                            String groupName, String description) {
        jobDetailFactory.setJobClass(clazz);
        jobDetailFactory.setName(name);
        jobDetailFactory.setGroup(groupName);
        jobDetailFactory.setDescription(description);
        jobDetailFactory.setDurability(true);
        jobDetailFactory.afterPropertiesSet();
        return jobDetailFactory.getObject();
    }

    /**
     * 根据参数,创建对应的CronTrigger对象
     *
     * @param job
     * @param time
     * @param name
     * @param groupName
     * @param description
     * @return
     */
    public static CronTrigger createCronTrigger(JobDetail job, String time,
                                                String name, String groupName, String description) {
        factoryBean.setName(name);
        factoryBean.setJobDetail(job);
        factoryBean.setCronExpression(time);
        factoryBean.setDescription(description);
        factoryBean.setGroup(groupName);
        try {
            factoryBean.afterPropertiesSet();
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return factoryBean.getObject();
    }
}

3.Quartz配置

#默认或是自己改名字都行
org.quartz.scheduler.instanceName: DefaultQuartzScheduler

#如果使用集群,instanceId必须唯一,设置成AUTO
org.quartz.scheduler.instanceId = AUTO

//通过RMI导出
org.quartz.scheduler.rmi.export: false
//连接到远端提供服务的scheduler
org.quartz.scheduler.rmi.proxy: false
org.quartz.scheduler.wrapJobExecutionInUserTransaction: false

//自带的线程池
org.quartz.threadPool.class: org.quartz.simpl.SimpleThreadPool
//并行执行job可用的线程数
org.quartz.threadPool.threadCount: 10
org.quartz.threadPool.threadPriority: 5
org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread: true
//下一次触发时间
org.quartz.jobStore.misfireThreshold: 60000

4.启动时读取数据库中的执行时间

@Configuration
public class autoconfig {

    @Autowired
    SysJobConfigRepository repository;

    @Autowired
    ApplicationContext context;

    @Bean
    public StdSchedulerFactory schedulerFactory(){
        StdSchedulerFactory factory = new StdSchedulerFactory();
        SysJobConfig jobConfig = repository.getById("1");
        boolean scheduler = jobUtils.createScheduler(jobConfig, context);
        System.out.println(scheduler == true? "执行成功":"执行失败");
        return factory;
    }
}

 

### 集成 Quartz 实现定时任务调度 为了在 Spring Boot 项目中集成 Quartz 来实现定时任务调度,开发者可以通过引入相应的依赖来简化这一过程。每当向 Spring Boot 项目添加新的依赖项时,Spring Boot 自动配置会自动尝试根据该依赖项配置 bean[^4]。 #### 添加 Maven 或 Gradle 依赖 首先,在 `pom.xml` 文件中加入 Quartz 和其相关组件的支持: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-quartz</artifactId> </dependency> ``` 对于使用 Gradle 构建系统的项目,则应在 build.gradle 中添加如下内容: ```groovy implementation 'org.springframework.boot:spring-boot-starter-quartz' ``` #### 创建 Job 类 定义具体的作业类继承自 QuartzJobBean 并重写 executeInternal 方法完成业务逻辑处理工作: ```java import org.quartzDisallowConcurrentExecution; import org.quartz.PersistJobDataAfterExecution; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; import org.springframework.scheduling.quartz.QuartzJobBean; @PersistJobDataAfterExecution @DisallowConcurrentExecution public class SampleJob extends QuartzJobBean { @Override protected void executeInternal(JobExecutionContext context) throws JobExecutionException { System.out.println("Executing job at " + new Date()); } } ``` 上述代码片段展示了创建一个简单的 Quartz 调度器实例的方法[^1]。 #### 定义 Scheduler Bean 通过 Java Config 方式注册 CronTriggerFactoryBean 及 MethodInvokingJobDetailFactoryBean 对象用于触发指定方法执行周期性的操作: ```java @Configuration @EnableScheduling public class QuartzConfig { @Autowired private ApplicationContext applicationContext; @Bean public JobDetail sampleJobDetail() { return JobBuilder.newJob(SampleJob.class).withIdentity("sampleJob").build(); } @Bean public Trigger sampleJobTrigger(@Qualifier("sampleJobDetail") JobDetail jobDetail) { return TriggerBuilder.newTrigger() .forJob(jobDetail) .withSchedule(CronScheduleBuilder.cronSchedule("0/5 * * * * ?")) .build(); } } ``` 这段配置说明了如何设置每五秒运行一次的任务计划表[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值