oracle quartz分布式_第三十九章:基于SpringBoot & Quartz完成定时任务分布式单节点持久化...

定时任务在企业项目比较常用到,几乎所有的项目都会牵扯该功能模块,定时任务一般会处理指定时间点执行某一些业务逻辑、间隔时间执行某一些业务逻辑等。我们在之前有讲过SpringBoot是已经集成了定时任务的,详见:第二十六章:SpringBoot使用@Scheduled创建定时任务,那么我们本章将会采用外置的quartz定时任务框架来完成定时任务的分布式单节点持久化,我们为什么要持久化定时任务呢?

在一些项目中定时任务可能是必不可少的,由于某种特殊的原因定时任务可能丢失,如重启定时任务服务项目后,原内存中的定时任务就会被完全释放!那对于我们来说可能是致命的问题。当然也有强制的办法解决这类问题,但是如果我们把定时任务持久化到数据库,像维护普通逻辑数据那样维护任务,就会避免项目中遇到的种种的特殊情况。

免费教程专题

恒宇少年在博客整理三套免费学习教程专题,由于文章偏多特意添加了阅读指南,新文章以及之前的文章都会在专题内陆续填充,希望可以帮助大家解惑更多知识点。

本章目标

基于SpringBoot架构整合定时任务框架quartz来完成分布式单节点定时任务持久化,将任务持久化到数据库,更好的预防任务丢失。

SpringBoot 企业级核心技术学习专题

专题

专题名称

专题描述

001

讲解SpringBoot一些企业级层面的核心组件

002

Spring Boot 核心技术简书每一篇文章码云对应源码

003

对Spring Cloud核心技术全面讲解

004

Spring Cloud 核心技术简书每一篇文章对应源码

005

全面讲解QueryDSL核心技术以及基于SpringBoot整合SpringDataJPA

006

全面讲解SpringDataJPA核心技术

007

SpringBoot系统的学习目录,敬请关注点赞!!!

构建项目

我们使用idea开发工具创建一个SpringBoot项目,pom.xml依赖配置如下所示:

...省略部分配置

UTF-8

UTF-8

1.8

1.1.5

2.3.0

org.springframework.boot

spring-boot-starter-data-jpa

org.springframework.boot

spring-boot-starter-web

mysql

mysql-connector-java

runtime

com.alibaba

druid

${druid.version}

org.quartz-scheduler

quartz

${quartz.version}

org.quartz-scheduler

quartz-jobs

${quartz.version}

org.springframework

spring-context-support

org.projectlombok

lombok

org.springframework.boot

spring-boot-starter-test

test

...省略部分配置

我们采用的是quartz官方最新版本2.3.0,新版本的任务调度框架做出了很多封装,使用也变得简易明了。

创建初始化完成,下面我们来创建定时任务相关的Configuration配置。

QuartzConfiguration

quartz与Spring相关框架的整合方式有很多种,我们今天采用jobDetail使用Spring Ioc托管方式来完成整合,我们可以在定时任务实例中使用Spring注入注解完成业务逻辑处理,下面我先把全部的配置贴出来再逐步分析,配置类如下所示:

package com.hengyu.chapter39.configuration;

import org.quartz.spi.JobFactory;

import org.quartz.spi.TriggerFiredBundle;

import org.springframework.beans.factory.annotation.Autowire;

import org.springframework.beans.factory.config.AutowireCapableBeanFactory;

import org.springframework.context.ApplicationContext;

import org.springframework.context.ApplicationContextAware;

import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.Configuration;

import org.springframework.core.io.ClassPathResource;

import org.springframework.scheduling.annotation.EnableScheduling;

import org.springframework.scheduling.quartz.SchedulerFactoryBean;

import org.springframework.scheduling.quartz.SpringBeanJobFactory;

import javax.sql.DataSource;

/**

* quartz定时任务配置

* ========================

* Created with IntelliJ IDEA.

* User:恒宇少年

* Date:2017/11/5

* Time:14:07

* 码云:http://git.oschina.net/jnyqy

* ========================

* @author 恒宇少年

*/

@Configuration

@EnableScheduling

public class QuartzConfiguration

{

/**

* 继承org.springframework.scheduling.quartz.SpringBeanJobFactory

* 实现任务实例化方式

*/

public static class AutowiringSpringBeanJobFactory extends SpringBeanJobFactory implements

ApplicationContextAware {

private transient AutowireCapableBeanFactory beanFactory;

@Override

public void setApplicationContext(final ApplicationContext context) {

beanFactory = context.getAutowireCapableBeanFactory();

}

/**

* 将job实例交给spring ioc托管

* 我们在job实例实现类内可以直接使用spring注入的调用被spring ioc管理的实例

* @param bundle

* @return

* @throws Exception

*/

@Override

protected Object createJobInstance(final TriggerFiredBundle bundle) throws Exception {

final Object job = super.createJobInstance(bundle);

/**

* 将job实例交付给spring ioc

*/

beanFactory.autowireBean(job);

return job;

}

}

/**

* 配置任务工厂实例

* @param applicationContext spring上下文实例

* @return

*/

@Bean

public JobFactory jobFactory(ApplicationContext applicationContext)

{

/**

* 采用自定义任务工厂 整合spring实例来完成构建任务

* see {@link AutowiringSpringBeanJobFactory}

*/

AutowiringSpringBeanJobFactory jobFactory = new AutowiringSpringBeanJobFactory();

jobFactory.setApplicationContext(applicationContext);

return jobFactory;

}

/**

* 配置任务调度器

* 使用项目数据源作为quartz数据源

* @

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值