SpringBoot集成Quartz 实现定时任务管理

定时任务quartz 管理和日志 定时任务quartz 管理和日志 前言 上一篇介绍了quartz的结构和基础用法,现在则是利用反射来实现定时任务的抽取,实现动态配置定时任务和相关日志管理 思路 两个实体任务表和任务日志表。 任务表存放:id、任务名、任务组名、调用类名方法名、调用目标参数、cron表达式、错误策略等 CREATE TABLE `td_sm_task` ( `task_id` varchar(64) NOT NULL COMMENT '任务ID', `task_name` varchar(64) NOT NULL D 阅读详情

首先我要记录两种quartz集成的方式

第一种是只有一个任务,定时执行即可,不需要动态管理

第二种是通过程序去控制定时任务的管理

不管哪种,首先导入依赖

<dependency>
    <groupId>org.quartz-scheduler</groupId>
    <artifactId>quartz</artifactId>
    <version>2.2.3</version>
    <exclusions>
        <exclusion>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
        </exclusion>
    </exclusions>
</dependency>

然后第一种很简单

首先创建配置类

 

package com.hqjl.classcard.quartz;

import org.springframework.context.annotation.Bean;
import org.springframework.scheduling.quartz.CronTriggerFactoryBean;
import org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean;
import org.springframework.scheduling.quartz.SchedulerFactoryBean;

/**
 * @author chunying
 * @Date: 2018/11/13 0013
 */
public class WechatConfiguration {
    @Bean(name = "detailFactoryBean_")
    //参数是执行定时任务的类
    public MethodInvokingJobDetailFactoryBean detailFactoryBean(AddSendMessageConfig wechatQuartz) {

        MethodInvokingJobDetailFactoryBean bean = new MethodInvokingJobDetailFactoryBean();
        //对应job对象
        bean.setTargetObject(wechatQuartz);
        //设置对应执行方法
        bean.setTargetMethod("refresh");
        bean.setConcurrent(false);

        return bean;
    }

    @Bean(name = "cronTriggerBean_")
    public CronTriggerFactoryBean cronTriggerBean(MethodInvokingJobDetailFactoryBean detailFactoryBean_){
        CronTriggerFactoryBean trigger = new CronTriggerFactoryBean ();
        trigger.setJobDetail(detailFactoryBean_.getObject());
        try {
            trigger.setCronExpression("0 0 2 * * ?");
//            trigger.setCronExpression ("0/5 * * ? * *");//每5秒执行一次
        }catch(Exception e) {
            throw new RuntimeException("定时刷新数据出错----------------------------------------------" + e);
        }
        return trigger;
    }

    @Bean
    public SchedulerFactoryBean schedulerFactory(CronTriggerFactoryBean cronTriggerBean_){
        SchedulerFactoryBean schedulerFactory = new SchedulerFactoryBean ();
        schedulerFactory.setTriggers(cronTriggerBean_.getObject());
        return schedulerFactory;
    }
}

这里有三个方法,

第一个配置MethodInvokingJobDetailFactoryBean 这里要传入我们job对象,也就是要执行任务的对象

第二个配置CronTriggerFactoryBean 这里要配置cron表达式 来控制job什么时候执行 传入上面的MethodInvokingJobDetailFactoryBean

第三个配置SchedulerFactoryBean 调度器传入我们上面配置的CronTriggerFactoryBean

这里的job对象我就不创建了 有一个AddSendMessageConfig对象 有一个refresh 方法就可以了 方法里面就是具体的需要执行的定时业务逻辑

 

第二种:

首先定义一个定时任务管理者

package com.hqjl.classcard.quartz;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;

import java.util.HashMap;
import java.util.Map;

/**
 * @author chunying
 * @Date: 2018/11/12 0012
 */
@Component
@Scope("singleton")
public class QuartzManager implements ApplicationContextAware {

    private static SchedulerFactory schedulerFactory = new StdSchedulerFactory();

    private static final String JOB_DEFAULT_GROUP_NAME = "JOB_DEFAULT_GROUP_NAME";

    private static final String TRIGGER_DEFAULT_GROUP_NAME = "TRIGGER_DEFAULT_GROUP_NAME";

    private Log logger = LogFactory.getLog(QuartzManager.class);

    private ApplicationContext applicationContext;

    private static Scheduler scheduler;

    static {
        try {
            scheduler = schedulerFactory.getScheduler();
        } catch (SchedulerException e) {
            e.printStackTrace();
        }
    }

    ;

    @Autowired
    private AutowiringSpringBeanJobFactory autowiringSpringBeanJobFactory;

    public void start() {
        //启动所有任务
        try {
            scheduler.setJobFactory(autowiringSpringBeanJobFactory);
            //启动所有任务,这里获取AbstractTask的所有子类
            Map<String, AbsTractTask> tasks = applicationContext.getBeansOfType(AbsTractTask.class);
            tasks.forEach((k, v) -> {
                String cronExpression = v.getCronExpression();
                if (cronExpression != null) {
                    addJob(k, v.getClass().getName(), cronExpression , new HashMap());
                }
            });
            logger.info("start jobs finished.");
        } catch (SchedulerException e) {
            logger.error(e.getMessage(), e);
            throw new RuntimeException("init Scheduler failed");
        }
    }

    public boolean addJob(String jobName, String jobClass, String cronExp, Map data) {
        boolean result = false;
        if (!CronExpression.isValidExpression(cronExp)) {
            return result;
        }
        try {
            JobDetail jobDetail = JobBuilder.newJob().withIdentity(new JobKey(jobName, JOB_DEFAULT_GROUP_NAME))
                    .ofType((Class<Job>) Class.forName(jobClass))
                    .build();
            //这里进行外部向job里面传递参数  
            JobDataMap jobDataMap = jobDetail.getJobDataMap();
            jobDataMap.putAll(data);
            Trigger trigger = TriggerBuilder.newTrigger()
                    .forJob(jobDetail)
                    .withSchedule(CronScheduleBuilder.cronSchedule(cronExp))
                    .withIdentity(new TriggerKey(jobName, TRIGGER_DEFAULT_GROUP_NAME))
                    .build();
            scheduler.setJobFactory(autowiringSpringBeanJobFactory);
            scheduler.scheduleJob(jobDetail, trigger);
            scheduler.start();
        } catch (Exception e) {
            logger.error(e.getMessage(), e);
            logger.error("QuartzManager add job failed");
        }
        return result;
    }

    public boolean updateJob(String jobName, String cronExp) {
        boolean result = false;
        if (!CronExpression.isValidExpression(cronExp)) {
            return result;
        }
        JobKey jobKey = new JobKey(jobName, JOB_DEFAULT_GROUP_NAME);
        TriggerKey triggerKey = new TriggerKey(jobName, TRIGGER_DEFAULT_GROUP_NAME);
        try {
            if (scheduler.checkExists(jobKey) && scheduler.checkExists(triggerKey)) {
                JobDetail jobDetail = scheduler.getJobDetail(jobKey);
                Trigger newTrigger = TriggerBuilder.newTrigger()
                        .forJob(jobDetail)
                        .withSchedule(CronScheduleBuilder.cronSchedule(cronExp))
                        .withIdentity(new TriggerKey(jobName, TRIGGER_DEFAULT_GROUP_NAME))
                        .build();
                scheduler.rescheduleJob(triggerKey, newTrigger);
                result = true;
            } else {
            }
        } catch (SchedulerException e) {
            logger.error(e.getMessage(), e);
        }
        return result;
    }

    public boolean deleteJob(String jobName) {
        boolean result = false;
        JobKey jobKey = new JobKey(jobName, JOB_DEFAULT_GROUP_NAME);
        try {
            if (scheduler.checkExists(jobKey)) {
                result = scheduler.deleteJob(jobKey);
            } else {
            }
        } catch (SchedulerException e) {
            logger.error(e.getMessage(), e);
        }
        return result;
    }

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        this.applicationContext = applicationContext;
    }
}

 

这里面用到了一个自定义的AutowiringSpringBeanJobFactory   说一下这个类,quartz在启动定时任务的时候,是自己新开启一个线程的,里面的对象是类似一个jobContext来管理的,所以如果job的具体实现需要用到我们的业务对象,会发现用spring注入为空,所以需要把quartz的job对象放到spring容器里进行管理。

package com.hqjl.classcard.quartz;

import org.quartz.spi.TriggerFiredBundle;
import org.springframework.beans.factory.config.AutowireCapableBeanFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.scheduling.quartz.SpringBeanJobFactory;
import org.springframework.stereotype.Service;

/**
 * @author chunying
 * @Date: 2018/11/12 0012
 */
@Service
public class AutowiringSpringBeanJobFactory extends SpringBeanJobFactory
        implements ApplicationContextAware {

    private transient AutowireCapableBeanFactory beanFactory;

    @Override
    public void setApplicationContext(final ApplicationContext context) {

        beanFactory = context.getAutowireCapableBeanFactory();
    }

    @Override
    protected Object createJobInstance(final TriggerFiredBundle bundle) throws Exception {
        final Object job = super.createJobInstance(bundle);

        beanFactory.autowireBean(job);

        return job;
    }
}

之后的就很简单的 定义一个抽象类实现job

package com.hqjl.classcard.quartz;

import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.springframework.stereotype.Component;

import java.text.ParseException;

/**
 * @author chunying
 * @Date: 2018/11/12 0012
 */
public abstract class AbsTractTask implements Job {

    protected abstract void executeInternal(JobExecutionContext context) throws ParseException;

    protected String cronExpression;

    @Override
    public void execute(JobExecutionContext context) {
        try {
            executeInternal(context);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public String getCronExpression() {
        return cronExpression;
    }
}

我们定义的job对象来继承这个类

package com.hqjl.classcard.quartz;

import com.hqjl.classcard.bean.WechatData;
import com.hqjl.classcard.bean.WechatQuartzMessage;
import com.hqjl.classcard.bean.response.AdminClassCheck;
import com.hqjl.classcard.bean.response.ClassCheck;
import com.hqjl.classcard.bean.response.SettingBean;
import com.hqjl.classcard.dao.WechatQuartzMessageDao;
import com.hqjl.classcard.data.check.DataResultService;
import com.hqjl.classcard.data.check.SchoolData;
import com.hqjl.classcard.service.CheckingInfoService;
import com.hqjl.classcard.service.SettingService;
import com.hqjl.classcard.service.StudentInfoService;
import com.hqjl.classcard.utils.CronUtil;
import com.hqjl.classcard.utils.DateUtil;
import com.hqjl.common.framework.spring.SpringContextUtil;
import com.hqjl.scheduler.bean.classcard.*;
import com.hqjl.scheduler.classcard.IScheduleClassCardService;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.quartz.DisallowConcurrentExecution;
import org.quartz.JobDataMap;
import org.quartz.JobExecutionContext;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;

import javax.annotation.PostConstruct;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.stream.Collectors;

/**
 * @author chunying
 */
@Component
@Service
@DisallowConcurrentExecution
public class WechatQuartz extends AbsTractTask{

    @Autowired
    private SendThread sendThread;

    @Autowired
    private CheckingInfoService checkingInfoService;

    @Autowired
    private StudentInfoService studentInfoService;

    @Autowired
    private QuartzManager quartzManager;

    @Autowired
    private WechatMessageConfig wechatMessageConfig;

    @Autowired
    private WechatQuartzMessageDao wechatQuartzMessageDao;

    @Autowired
    private IScheduleClassCardService iScheduleClassCardService;

    @Autowired
    private SettingService settingService;

    @Autowired
    private DataResultService dataResultService;

    public WechatQuartz(){};

    private static final Log LOG = LogFactory.getLog(WechatQuartz.class);

   //具体job实现
    @Override
    protected void executeInternal(JobExecutionContext context){
        //这里可以拿到它进行job参数的传递 使用和map大体相同
       JobDataMap jobDataMap = context.getJobDetail().getJobDataMap();
    }
}

 

Springboot集成quartz实现定时任务管理 Springboot集成quartz实现定时任务管理 思考: springboot如何集合quartz? quartz如何实现持久化到数据库中? Quartz 的基础原理 Quartz的核心组成: Scheduler – 核心调度器 Job – 任务 JobDetail – 任务描述 Trigger – 触发器 Quartz任务调度基本实现原理: Quartz 任务调度的核心元素... 阅读详情

相关推荐

spring boot集成quartz实现定时任务的增删改查

整理一下很久之前写的quartz集成到spring boot代码,主要为了实现可视化操作定时任务,只添加了后台rest接口和代码,前台代码请自行处理。 1. 引入quartz &lt;dependency&gt; &lt;groupId&gt;org.quartz-scheduler&lt;/groupId&gt; &lt;artifactId&gt;quartz&lt;/a...

Tina的博客 3406

Quartz+Spring Boot实现动态管理定时任务

在实践中遇到动态管理定时任务的需求,场景通常是动态添加、更新、删除任务,借助Quartz,可方便实现功能。 以下使用Quartz结合Spring Boot方式使用。 POM依赖 &amp;lt;parent&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;sp

wang704987562的博客 1万+

【SpringBoot】82、SpringBoot集成Quartz实现动态管理定时任务

Quartz 是一个开源的作业调度框架,它完全由 Java 写成,并设计用于 J2SE 和 J2EE 应用中。它提供了巨大的灵 活性而不牺牲简单性。你能够用它来为执行一个作业而创建简单的或复杂的调度。它有很多特征,如:数据库支持,集群,插件,EJB 作业预构 建,JavaMail 及其它,支持 cron-like 表达式等等

JACKAL 3万+

SpringBoot整合Quartz,通过注解方式实现定时任务

定时任务注解 @QuartzSchedule name:定时任务名称 cronSchedule:执行计划。在数据库创建tables_mysql.sql里面的表。每新增一个定时任务,只需要创建一个如下的类。集群状态需要使用分布式锁。

lsqgz123的博客 1921

Spring Boot进阶(69):轻松实现定时任务持久化!SpringBoot集成quartz带你玩转定时任务删除、暂停、获取等操作!【附项目源码】

本篇文章主要介绍了如何使用SpringBoot整合Quartz,并将定时任务写入库中。首先,我们会给出整个项目的架构,然后详细介绍如何配置Quartz,并将定时任务写入库中。最后,我们还会提供一个测试用例,用于验证我们的定时任务是否成功运行

**My Coding Family** 3838

Windows环境下DataEase一站式安装指南(含WSL2+Docker配置)

本文详细介绍了在Windows环境下通过WSL2和Docker快速部署DataEase的完整教程。从WSL2配置、Docker环境搭建到DataEase离线安装,逐步指导用户完成一站式部署,特别适合需要快速搭建数据分析平台的开发者。教程包含常见问题解决方案和性能优化技巧,帮助用户高效使用这款国产开源数据可视化工具。

weixin_42526166的博客 392

Spring Boot集成持久化Quartz定时任务管理和界面展示

前言本文是对之前的一篇文章Spring+SpringMVC+mybatis+Quartz整合代码部分做的一个修改和补充, 其中最大的变化就是后台框架变成了Spring Boot。本工程所用到的技术或工具有: Spring Boot Mybatis Quartz PageHelper VueJS ElementUI MySql数据库 正文配置本例中仍然是使用mysql数据库作为Quartz任务持久化的

天降风云的博客 13万+

Windows下Python调用D435i相机避坑指南:从SDK版本选择到RealSense Viewer报错解决

本文详细介绍了在Windows环境下使用Python调用Intel D435i相机的完整避坑指南。重点解决了SDK版本选择问题,推荐使用稳定的Intel RealSense SDK 2.54.2版本,并提供了从环境配置、常见报错解决到实际应用案例的全流程实践指导,帮助开发者高效完成相机部署与开发。

palm99的专栏 923

spring boot 定时任务管理

spring boot 有scheduler 可以做定时任务,我们也可以通过scheduler做定时任务管理,实现新增,删除,修改定时任务功能。测试调用的定时任务方法 和 类。当项目启动完成就加载定时任务。创建获取对象容器工具类。创建定时任务执行线程。

^无心人^_-的博客 913

利用 Docker Distribution 搭建私有的 Docker Registry

1、拓扑

weixin_44983653的博客 1067

GEO芯片数据下载和探针ID转换(保姆级教程)

R语言安装、GEO芯片数据下载、探针ID转换

qq_43138237的博客 3万+

【quartz】springboot 集成 quartz 实现动态管理定时任务

maven依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-quartz</artifactId> </dependency&...

engineer_hzl 733

GAN网络(论文阅读):Generative Adversarial Nets

当判别器效果比较好时,D(G(z))值为0,则log(1-D(G(z)))值为0,当判别器效果不好,会输出一个大于0 的数,则log(1-D(G(z)))值就为一个负数,在极端情况下,会得到负无穷大,此时判别失误。在价值函数的第二项中存在问题,在早期G比较弱的时,生成的数据和真实数据相差很大,D就容易训练的比较好,很容易区分,就会导致log(1-D(G(z)))变成0 ,这样很难求梯度来优化G,所以更新G时,将优化函数改为log(D(G(z)))。最终使G赢,即G生成的数据D判别不出来。

m0_54248968的博客 2290

Spring / SpringBoot集成Quartz实现动态管理定时任务

前言: 最近在做Java开发对接微信公众平台之类的工作,在开发过程中遇到一个需求是定时任务这块的,但是普通的定时任务还远远不能满足;最后要实现的效果是每个任务都是不同的定时时间来执行而且是在前台页面上来控制这些任务的创建,取消,开启,暂停;就好比是向数据库添加一条记录(任务)那么在添加成功后这个任务就是进入定时执行状态了,每次执行的时间是由添加任务时前台页面选择的时间; 要实现的效果如下: 该项目的整体框架和环境选用的时SpringBoot,所以当时在网上看了大部分的boot整合Quartz的文章发现都

qq_44322555的博客 7941

【异常】安装hermes-agent提示Git克隆仓库网络中断 fetch-pack: unexpected disconnect while reading sideband packet

本文分析了Git克隆仓库时出现网络中断错误的常见原因及解决方案。报错表现为连接被远程主机关闭、管道破裂或数据包意外终止,通常由网络不稳定、仓库过大或配置不当引起。提供了5种优先级排序的解决方法:1)使用浅克隆减少数据量;2)优化Git配置参数;3)切换网络或配置代理;4)检查SSH密钥设置;5)改用HTTPS方式克隆。特别推荐先尝试「浅克隆+HTTPS」组合方案快速验证,若问题持续再根据具体报错深入排查。文中包含详细的命令示例和配置说明,适合不同网络环境下的Git用户参考。

奶爸的编程之路,也就一周冷个三天 1418

Qt之自定义带游标的QSlider

最近翻看6年前写了一篇关于QSlider的博客:Qt自定义带游标的slider,在滑块正上方显示当前值 发现存在很多问题,比如游标的坐标不准确;如果游标宽度稍大,滑到Slider最左或最右的时候会显示不全;游标不够美观。 PS:这里有个漂亮的Slider样式表https://blog.youkuaiyun.com/caoshangpa/article/details/53389517于是今天再实现了一遍,依然是子类化QSlider,效果如下,支持设置游标的尺寸:这一次的实现比之前简洁很多,只需要重新paintEvent

草上爬的博客 6278

定时任务:springboot集成Quartz实现多任务多触发的动态管理

本文主要讲解以下几个方面: 1.定时任务的定义及其常见的模式 2.springboot集成quart实例 3.中途会遇到的一些问题 一、定时任务的定义及其常见的模式 1)定时任务的定义 首先要明白的是,定时任务在系统中的表现形式和在我们口中常说的定时是不一样的: 口中的定时:在明天的八点把设备打开,晚上八点把设备关掉,这个月每天都这样。 系统的定时:上述的定...

a510750的专栏 1万+

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Spring boot 集成Quartz 实现定时任务动态管理服务端

调查了下用Spring boot集成Quartz来实现定时任务的动态管理,记下来备用。主要使用 Spring boot、Quartz、Mybatis实现,其中Quartz任务在SqlServer数据库保存,业务数据库是Oracle。需要实现数据源的动态管理,定时任务使用Spring IOC管理等功能。创建Maven projectPOM中依赖如下:&lt;parent&gt;         &l...

码U、me的专栏 1044

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

springboot集成quartz并实现定时任务管理

定时任务配置ScheduleConfig基础实体类Entity、DTO、Dao、Dao映射文件、Service、Service实现。

qq_43560721的博客 478

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

Quartz:(2)Springboot集成Quartz框架,并实现自定义开启,关闭定时任务

一、导入依赖 <!--quartz集成springboot--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-quartz</artifactId> </dependency> 二、书写配置文件 spring:

TylerYue的博客 1510

spring boot 集成 Quartz

第一步:导入Quartz依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-quartz</artifactId> </dependency> 第二步:在spring boot启动类添加注解 @EnableSchedu

爱拼才会赢的博客 316

SpringBoot集成Quartz动态创建、启动、暂停、恢复、删除定时任务,实现定时任务的管理

目录 一、整个 Quartz 的代码流程基本基本如下: 二、进入正题,引入依赖 三、创建Job 四、创建任务调度器(Scheduler) 五、创建任务明细(JobDetail) 六、创建触发器(Trigger) 七、启动任务 八、任务的暂停 九、任务的恢复十、任务的删除 看了好多文章,都只讲了基础的demo用法,也就是简单的创建运行定时任务,对定时任务的管理却很少。 我这里从0开始搭建一个简单的demo,包括定时任务的各种操作,以及API的一些用法,可以实现大多场景的需求。如:

zhangkaixuan456的博客 1109

重学SpringBoot3-整合Quartz定时任务

Quartz 是一个开源的任务调度框架,用于在应用程序中创建、管理和调度定时任务。将 Quartz 和 Spring Boot 3 结合,可以轻松实现定时任务的灵活管理。本文将详细介绍如何在 Spring Boot 3 项目中集成 Quartz Scheduler 并实现示例任务的调度。

CoderJia的学习之路 5517

SpringBoot集成Quartz数据库配置定时任务

Spring Boot 整合 Quartz 实现定时任务集群 文章参考 https://blog.youkuaiyun.com/l18848956739/article/details/86597709 https://blog.youkuaiyun.com/xibei19921101/article/details/105012749 https://blog.youkuaiyun.com/WLPJLP/article/details/103908448 https://blog.youkuaiyun.com/sqlgao22/arti.

人生就像一场戏 4782

第四十七章:SpringBoot2.0新特性 - Quartz自动化配置集成

在新版本的SpringBoot2.0发布后,急迫尝鲜的我将相关的项目已经更换为最新版本,在SpringBoot源码GitHub看到更新日志,表明了针对Quartz新版本进行了 AutoConfiguration自动化配置,省去了很多繁琐的配置。 官网更新日志 Auto-c...

chuifuhuo6864的博客 191
上一篇: Java设计模式----------代理模式
下一篇: Java-----实现一个简单的栈结构
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值