定时任务的执行有多种方法,其中常使用的定时器有JDK Timer、Spring Task、Quartz等三种。JDK自带的定时器Timer使用灵活,配置简单,适用于一些中小项目;Spring Task配置较为简单轻量,需要Spring框架支持;Quartz的功能强大,配置也比较复杂,适合大型、多定时任务的项目使用。可以参考下面几个博主的文章

Java定时器(Timer)_罗汉爷的博客-CSDN博客_java timer

spring-boot定时器_Leo187的博客-CSDN博客

定时任务框架Quartz-(一)Quartz入门与Demo搭建_是Guava不是瓜娃的博客-CSDN博客_quartz

在这里我记录一次自己springboot项目中使用自定义注解加quartz实现自定义配置的定时方案。

pom.xml

       <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>org.quartz-scheduler</groupId><artifactId>quartz</artifactId><version>2.2.1</version><!-- Quartz默认需要slf4j支持。springboot中,提供了更高版本的slf4j --><exclusions><exclusion><artifactId>slf4j-api</artifactId><groupId>org.slf4j</groupId></exclusion></exclusions></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-context-support</artifactId><version>5.3.9</version></dependency>

配置文件application-dev.yml:

#定时任务配置
scheduler:enable: true #默认false,不启用

任务管理类

package com.rainnie.demo.config;import com.rainnie.demo.service.JobManageService;
import org.quartz.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.scheduling.quartz.SchedulerFactoryBean;
import org.springframework.stereotype.Component;import java.util.Date;/*** @PackageName: com.rainnie.demo.config* @ClaseName: SchedulerManager* @Description: SchedulerManager* @Author: rainnie* @Date: 2022/3/25 9:36* @params *@params 定时任务管理类$*/
@Component
public class SchedulerManager implements ApplicationRunner {private Logger logger = LoggerFactory.getLogger(SchedulerManager.class);@Value("${scheduler.enable:false}")private Boolean enable;@Autowired(required = false)private SchedulerFactoryBean schedulerFactoryBean;private static final String JOB_NAME = "_JOB_NAME";private static final String TRIGGER_NAME = "_TRIGGER_NAME";private static final String GROUP = "_GROUP";private Scheduler scheduler = null;@Autowired(required = false)private JobManageService jobManageService;@Overridepublic void run(ApplicationArguments args) throws Exception {scheduler = schedulerFactoryBean.getScheduler();try {if(enable){//把所有已经启动过的定时任务启动jobManageService.startJob();}} catch (Exception e) {logger.error("启动项目开启定时任务失败!", e);}}/*** 定时启动job*/public void startJob(Class job, String cron) throws SchedulerException {String jobName = job.getName();scheduler = schedulerFactoryBean.getScheduler();JobKey jobKey = JobKey.jobKey(jobName + JOB_NAME, jobName + GROUP);if (scheduler.getJobDetail(jobKey) != null) {//已经启动过了return;}JobDetail jobDetail = JobBuilder.newJob(job).withIdentity(jobName + JOB_NAME, jobName + GROUP).build();CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(cron);CronTrigger cronTrigger = TriggerBuilder.newTrigger().withIdentity(jobName + TRIGGER_NAME, jobName + GROUP).withSchedule(cronScheduleBuilder).build();scheduler.scheduleJob(jobDetail, cronTrigger);}/*** 间隔启动job*/public void startJob(Class job, Integer iTimeUnit, Integer interval) throws SchedulerException {String jobName = job.getName();scheduler = schedulerFactoryBean.getScheduler();JobKey jobKey = JobKey.jobKey(jobName + JOB_NAME, jobName + GROUP);//已经启动过了if (scheduler.getJobDetail(jobKey) != null) {return;}JobDetail jobDetail = JobBuilder.newJob(job).withIdentity(jobName + JOB_NAME, jobName + GROUP).build();Date startTime = new Date();startTime.setTime(startTime.getTime() + 3000L);//设置三秒后开始执行//定义任务调度的时间间隔和次数SimpleScheduleBuilder simpleScheduleBuilder = SimpleScheduleBuilder.simpleSchedule();//定义时间间隔if (iTimeUnit.equals(1)) {//毫秒simpleScheduleBuilder = simpleScheduleBuilder.withIntervalInMilliseconds(interval);} else if (iTimeUnit.equals(2)) {//秒simpleScheduleBuilder = simpleScheduleBuilder.withIntervalInSeconds(interval);} else if (iTimeUnit.equals(3)) {//分simpleScheduleBuilder = simpleScheduleBuilder.withIntervalInMinutes(interval);} else {//小时simpleScheduleBuilder = simpleScheduleBuilder.withIntervalInHours(interval);}//定义重复执行次数是无限次simpleScheduleBuilder = simpleScheduleBuilder.withRepeatCount(SimpleTrigger.REPEAT_INDEFINITELY);SimpleTrigger trigger = TriggerBuilder.newTrigger().withIdentity(jobName + JOB_NAME, jobName + GROUP)// 定义名字和组.startAt(startTime)//定义开始时间.withSchedule(simpleScheduleBuilder).build();scheduler.scheduleJob(jobDetail, trigger);}/*** description 删除定时任务*/public void deleteJob(Class job) throws SchedulerException {String jobName = job.getName();JobKey jobKey = JobKey.jobKey(jobName + JOB_NAME, jobName + GROUP);if (scheduler.getJobDetail(jobKey) != null) {scheduler.deleteJob(jobKey);}}
}

自定义注解:

package com.rainnie.demo.annotation;import java.lang.annotation.*;/*** @PackageName: com.rainnie.demo.annotation* @ClaseName: CronTask* @Description: Custom annotations: add annotation configuration to the timing task implementation class, enable true by default* @Author: rainnie*/
@Target({ ElementType.TYPE })
@Documented
@Retention(RetentionPolicy.RUNTIME)
public @interface CronTask {/*** 排序,默认最大* @return*/int index() default 2147483647;/*** 任务名称* @return*/String name() ;/*** 备注* @return*/String remark() default "";/*** 版本* @return*/String version() default "1";/*** 是否开启 默认开启true* @return*/boolean enable() default true;
}

测试类--pojo:

package com.rainnie.demo.pojo;import java.io.Serializable;
import java.util.Date;/*** @PackageName: com.rainnie.demo.pojo* @ClaseName: JobManage* @Description: JobManage* @Author: zhangyx* @Date: 2022/3/26 15:08* @params *@params renwu$*/
public class JobManage implements Serializable {private static final long serialVersionUID = 548967589662L;private Integer id;private Integer iFlag;private Long iOrder;private String cCreater;private Date dCreated;private Date dModified;private String cEditer;private Integer cUserid;private String cUsername;private String cFromId;/*** job类名称 C_CLASS_NAME*/private String cClassName;/*** job业务名称 C_NAME*/private String cName;/*** job启动类型,1:定时启动,2:间隔启动 I_TYPE*/private Integer iType;/*** 定时启动时cron表达式 C_CRON*/private String cCron;/*** 间隔启动时间间隔,单位秒 I_INTERVAL*/private Integer iInterval;/*** 是否已启动,1:已启动,2:未启动 I_START*/private Integer iStart;/*** 间隔启动时间单位:1代表毫秒,2代表秒,3代表分,4代表小时*/private Integer iTimeUnit;/*** 备注 C_MEMO*/private String cMemo;public static long getSerialVersionUID() {return serialVersionUID;}public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public Integer getiFlag() {return iFlag;}public void setiFlag(Integer iFlag) {this.iFlag = iFlag;}public Long getiOrder() {return iOrder;}public void setiOrder(Long iOrder) {this.iOrder = iOrder;}public String getcCreater() {return cCreater;}public void setcCreater(String cCreater) {this.cCreater = cCreater;}public Date getdCreated() {return dCreated;}public void setdCreated(Date dCreated) {this.dCreated = dCreated;}public Date getdModified() {return dModified;}public void setdModified(Date dModified) {this.dModified = dModified;}public String getcEditer() {return cEditer;}public void setcEditer(String cEditer) {this.cEditer = cEditer;}public Integer getcUserid() {return cUserid;}public void setcUserid(Integer cUserid) {this.cUserid = cUserid;}public String getcUsername() {return cUsername;}public void setcUsername(String cUsername) {this.cUsername = cUsername;}public String getcFromId() {return cFromId;}public void setcFromId(String cFromId) {this.cFromId = cFromId;}public String getcClassName() {return cClassName;}public void setcClassName(String cClassName) {this.cClassName = cClassName;}public String getcName() {return cName;}public void setcName(String cName) {this.cName = cName;}public Integer getiType() {return iType;}public void setiType(Integer iType) {this.iType = iType;}public String getcCron() {return cCron;}public void setcCron(String cCron) {this.cCron = cCron;}public Integer getiInterval() {return iInterval;}public void setiInterval(Integer iInterval) {this.iInterval = iInterval;}public Integer getiStart() {return iStart;}public void setiStart(Integer iStart) {this.iStart = iStart;}public Integer getiTimeUnit() {return iTimeUnit;}public void setiTimeUnit(Integer iTimeUnit) {this.iTimeUnit = iTimeUnit;}public String getcMemo() {return cMemo;}public void setcMemo(String cMemo) {this.cMemo = cMemo;}@Overridepublic String toString() {return "JobManage{" +"id=" + id +", iFlag=" + iFlag +", iOrder=" + iOrder +", cCreater='" + cCreater + '\'' +", dCreated=" + dCreated +", dModified=" + dModified +", cEditer='" + cEditer + '\'' +", cUserid=" + cUserid +", cUsername='" + cUsername + '\'' +", cFromId='" + cFromId + '\'' +", cClassName='" + cClassName + '\'' +", cName='" + cName + '\'' +", iType=" + iType +", cCron='" + cCron + '\'' +", iInterval=" + iInterval +", iStart=" + iStart +", iTimeUnit=" + iTimeUnit +", cMemo='" + cMemo + '\'' +'}';}
}

测试类-mapper.java:

package com.rainnie.demo.dao;import com.rainnie.demo.pojo.JobManage;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Repository;import java.util.List;
import java.util.Map;@Mapper
@Repository
public interface JobManageMapper {/**** @mbg.generated*/int deleteByPrimaryKey(String id);/**** @mbg.generated*/int insert(JobManage record);/**** @mbg.generated*/int insertSelective(JobManage record);/**** @mbg.generated*/JobManage selectByPrimaryKey(String id);/**** @mbg.generated*/int updateByPrimaryKeySelective(JobManage record);/**** @mbg.generated*/int updateByPrimaryKey(JobManage record);List<String> selectJobClassName();int startOrStopJob(JobManage jobManage);int stopJob();List<JobManage> selectAll(Map map);
}

测试类-mapper.xml:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.rainnie.demo.dao.JobManageMapper"><resultMap id="BaseResultMap" type="com.rainnie.demo.pojo.JobManage"><id column="ID" jdbcType="VARCHAR" property="id" /><result column="C_CLASS_NAME" jdbcType="VARCHAR" property="cClassName" /><result column="C_NAME" jdbcType="VARCHAR" property="cName" /><result column="I_TYPE" jdbcType="INTEGER" property="iType" /><result column="C_CRON" jdbcType="VARCHAR" property="cCron" /><result column="I_INTERVAL" jdbcType="INTEGER" property="iInterval" /><result column="I_START" jdbcType="INTEGER" property="iStart" /><result column="I_TIME_UNIT" jdbcType="INTEGER" property="iTimeUnit" /><result column="C_MEMO" jdbcType="VARCHAR" property="cMemo" /><result column="I_FLAG" jdbcType="INTEGER" property="iFlag" /><result column="I_ORDER" jdbcType="DECIMAL" property="iOrder" /><result column="D_CREATED" jdbcType="TIMESTAMP" property="dCreated" /><result column="C_CREATER" jdbcType="VARCHAR" property="cCreater" /><result column="D_MODIFIED" jdbcType="TIMESTAMP" property="dModified" /><result column="C_EDITER" jdbcType="VARCHAR" property="cEditer" /></resultMap><sql id="Base_Column_List">ID, C_CLASS_NAME, C_NAME, I_TYPE, C_CRON, I_INTERVAL, I_START, I_TIME_UNIT, I_INTERVAL, C_MEMO, I_FLAG, I_ORDER,D_CREATED, C_CREATER, D_MODIFIED, C_EDITER</sql><select id="selectByPrimaryKey" parameterType="java.lang.String" resultMap="BaseResultMap">select <include refid="Base_Column_List" />from tbl_jobwhere ID = #{id,jdbcType=VARCHAR}</select><update id="deleteByPrimaryKey" parameterType="java.lang.String">update tbl_job set I_FLAG = 0 where ID = #{id,jdbcType=VARCHAR}</update><insert id="insert" parameterType="com.rainnie.demo.pojo.JobManage">insert into tbl_job (ID, C_CLASS_NAME, C_NAME, I_TYPE, C_CRON, I_TIME_UNIT, I_INTERVAL,C_MEMO, I_ORDER, D_CREATED, C_CREATER)values (#{id,jdbcType=VARCHAR}, #{cClassName,jdbcType=VARCHAR}, #{cName,jdbcType=VARCHAR}, #{iType,jdbcType=INTEGER}, #{cCron,jdbcType=VARCHAR}, #{iTimeUnit,jdbcType=INTEGER}, #{iInterval,jdbcType=INTEGER},#{cMemo,jdbcType=VARCHAR}, #{iOrder,jdbcType=DECIMAL}, #{dCreated,jdbcType=TIMESTAMP}, #{cCreater,jdbcType=VARCHAR})</insert><insert id="insertSelective" parameterType="com.rainnie.demo.pojo.JobManage">insert into tbl_job<trim prefix="(" suffix=")" suffixOverrides=","><if test="id != null">ID,</if><if test="cClassName != null">C_CLASS_NAME,</if><if test="cName != null">C_NAME,</if><if test="iType != null">I_TYPE,</if><if test="cCron != null">C_CRON,</if><if test="iInterval != null">I_INTERVAL,</if><if test="iStart != null">I_START,</if><if test="cMemo != null">C_MEMO,</if><if test="iFlag != null">I_FLAG,</if><if test="iOrder != null">I_ORDER,</if><if test="dCreated != null">D_CREATED,</if><if test="cCreater != null">C_CREATER,</if><if test="dModified != null">D_MODIFIED,</if><if test="cEditer != null">C_EDITER,</if></trim><trim prefix="values (" suffix=")" suffixOverrides=","><if test="id != null">#{id,jdbcType=VARCHAR},</if><if test="cClassName != null">#{cClassName,jdbcType=VARCHAR},</if><if test="cName != null">#{cName,jdbcType=VARCHAR},</if><if test="iType != null">#{iType,jdbcType=INTEGER},</if><if test="cCron != null">#{cCron,jdbcType=VARCHAR},</if><if test="iInterval != null">#{iInterval,jdbcType=INTEGER},</if><if test="iStart != null">#{iStart,jdbcType=INTEGER},</if><if test="cMemo != null">#{cMemo,jdbcType=VARCHAR},</if><if test="iFlag != null">#{iFlag,jdbcType=INTEGER},</if><if test="iOrder != null">#{iOrder,jdbcType=DECIMAL},</if><if test="dCreated != null">#{dCreated,jdbcType=TIMESTAMP},</if><if test="cCreater != null">#{cCreater,jdbcType=VARCHAR},</if><if test="dModified != null">#{dModified,jdbcType=TIMESTAMP},</if><if test="cEditer != null">#{cEditer,jdbcType=VARCHAR},</if></trim></insert><update id="updateByPrimaryKeySelective" parameterType="com.rainnie.demo.pojo.JobManage">update tbl_job<set><if test="cClassName != null">C_CLASS_NAME = #{cClassName,jdbcType=VARCHAR},</if><if test="cName != null">C_NAME = #{cName,jdbcType=VARCHAR},</if><if test="iType != null">I_TYPE = #{iType,jdbcType=INTEGER},</if>C_CRON = #{cCron,jdbcType=VARCHAR},I_TIME_UNIT = #{iTimeUnit,jdbcType=INTEGER},I_INTERVAL = #{iInterval,jdbcType=INTEGER},<if test="iStart != null">I_START = #{iStart,jdbcType=INTEGER},</if><if test="cMemo != null">C_MEMO = #{cMemo,jdbcType=VARCHAR},</if><if test="dModified != null">D_MODIFIED = #{dModified,jdbcType=TIMESTAMP},</if><if test="cEditer != null">C_EDITER = #{cEditer,jdbcType=VARCHAR},</if></set>where ID = #{id,jdbcType=VARCHAR}</update><update id="updateByPrimaryKey" parameterType="com.rainnie.demo.pojo.JobManage">update tbl_jobset C_CLASS_NAME = #{cClassName,jdbcType=VARCHAR},C_NAME = #{cName,jdbcType=VARCHAR},I_TYPE = #{iType,jdbcType=INTEGER},C_CRON = #{cCron,jdbcType=VARCHAR},I_INTERVAL = #{iInterval,jdbcType=INTEGER},I_START = #{iStart,jdbcType=INTEGER},C_MEMO = #{cMemo,jdbcType=VARCHAR},I_FLAG = #{iFlag,jdbcType=INTEGER},I_ORDER = #{iOrder,jdbcType=DECIMAL},D_CREATED = #{dCreated,jdbcType=TIMESTAMP},C_CREATER = #{cCreater,jdbcType=VARCHAR},D_MODIFIED = #{dModified,jdbcType=TIMESTAMP},C_EDITER = #{cEditer,jdbcType=VARCHAR}where ID = #{id,jdbcType=VARCHAR}</update><select id="selectJobClassName" resultType="java.lang.String">select C_CLASS_NAME from tbl_job where I_FLAG = -1</select><select id="selectAll" parameterType="Integer" resultMap="BaseResultMap">select <include refid="Base_Column_List"/> from tbl_job where I_FLAG = -1<if test="cKlassName != null">and C_CLASS_NAME = #{cKlassName}</if><if test="start != null">and I_START = #{start}</if>ORDER BY I_ORDER</select><update id="startOrStopJob">update tbl_job set<choose><when test="iStart == 1">I_START = 2</when><when test="iStart == 2">I_START = 1</when><otherwise>I_FLAG = -1</otherwise></choose>where ID = #{id,jdbcType=VARCHAR}</update><update id="stopJob">update tbl_job set I_START = 2 where I_START = 1</update>
</mapper>

测试类-service:

  /*** 将已经启动过得任务启动*/void startJob() throws Exception;

测试类-serviceImpl:

package com.rainnie.demo.service.impl;import com.rainnie.demo.config.SchedulerManager;
import com.rainnie.demo.dao.JobManageMapper;
import com.rainnie.demo.pojo.JobManage;
import com.rainnie.demo.service.JobManageService;
import com.rainnie.demo.utils.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;import java.util.*;
import java.util.stream.Collectors;@Service
public class JobManageServiceImpl implements JobManageService {@Autowiredprivate JobManageMapper jobManageMapper;@Autowiredprivate SchedulerManager schedulerManager;@Overridepublic void startJob() throws Exception {Map map = new HashMap();map.put("start", 1);List<JobManage> jobManageList = jobManageMapper.selectAll(map);for (JobManage jobManage : jobManageList) {String className = jobManage.getcClassName();Class<?> jobClass = null;if (!StringUtils.isNull(className) && className.indexOf("rainnie") != -1) {jobClass = Class.forName(className);} else {throw new RuntimeException("异常,类不存在请确保classname正确");}Integer type = jobManage.getiType();if (type.equals(1)) {//定时启动schedulerManager.startJob(jobClass, jobManage.getcCron());} else if (type.equals(2)) {//间隔启动schedulerManager.startJob(jobClass, jobManage.getiTimeUnit(), jobManage.getiInterval());}}}}

最后新建一个任务类:

package com.rainnie.demo.job;import com.rainnie.demo.annotation.CronTask;
import com.rainnie.demo.dao.ActorMapper;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;import java.util.Date;@CronTask(name = "检测任务", enable = true, index = 33)
public class GjCheckExceptionProcessJob implements Job {private Logger logger = LoggerFactory.getLogger(GjCheckExceptionProcessJob.class);private static boolean flag = true;@Overridepublic void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {if(flag) {flag = false;try {System.out.println("--------dotosomething:"+new Date());} catch (Exception e) {e.printStackTrace();logger.info("定时任务执行检测异常!");}flag = true;}}}

建表语句:

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;-- ----------------------------
-- Table structure for tbl_job
-- ----------------------------
DROP TABLE IF EXISTS `tbl_job`;
CREATE TABLE `tbl_job`  (`ID` int(11) NOT NULL COMMENT '主键',`C_CLASS_NAME` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT 'job类名称',`C_NAME` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT 'job业务名称',`I_TYPE` int(11) NULL DEFAULT NULL COMMENT 'job启动类型,1:定时启动,2:间隔启动',`C_CRON` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '定时启动时cron表达式',`I_TIME_UNIT` int(11) NULL DEFAULT NULL COMMENT '间隔启动时间单位:1代表毫秒,2代表秒,3代表分,4代表小时',`I_INTERVAL` int(11) NULL DEFAULT NULL COMMENT '间隔启动时间间隔',`I_START` int(11) NULL DEFAULT NULL COMMENT '是否已启动,1:已启动,2:未启动',`C_MEMO` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '备注',`I_FLAG` int(11) NULL DEFAULT NULL COMMENT '数据标识:-1_启用|0_删除|1_禁用',`I_ORDER` int(11) NULL DEFAULT NULL,`D_CREATED` date NULL DEFAULT NULL COMMENT '创建时间',`C_CREATER` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '当前登陆用户id',`D_MODIFIED` date NULL DEFAULT NULL COMMENT '修改时间',`C_EDITER` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,PRIMARY KEY (`ID`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;-- ----------------------------
-- Records of tbl_job
-- ----------------------------
INSERT INTO `tbl_job` VALUES (1, 'com.rainnie.demo.job.GjCheckExceptionProcessJob', 常检测任务', 2, NULL, 2, 20, 1, NULL, -1, 1, '2022-03-29', 'rainnie', '2022-03-29', 'rainnie');SET FOREIGN_KEY_CHECKS = 1;

启动项目,输入如下:

--------dotosomething:2022-04-11 14:47:21
--------dotosomething:2022-04-11 14:47:41
--------dotosomething:2022-04-11 14:48:01
--------dotosomething:2022-04-11 14:48:21
--------dotosomething:2022-04-11 14:48:41
--------dotosomething:2022-04-11 14:49:01
--------dotosomething:2022-04-11 14:49:21
--------dotosomething:2022-04-11 14:49:41

Quartz定时器实现相关推荐

  1. Spring的quartz定时器重复执行二次的问题解决

    Spring的quartz定时器重复执行二次的问题解决 参考文章: (1)Spring的quartz定时器重复执行二次的问题解决 (2)https://www.cnblogs.com/alamps/p ...

  2. 实现quartz定时器及quartz定时器原理介绍

    今天研究定时器,在网上看了一篇不错的文章,推荐给大家! 实现quartz定时器及quartz定时器原理介绍

  3. spring中配置quartz定时器

    spring中配置quartz定时器 最近项目中用到定时器,项目用的spring所以想在spring中配置一下定时器,看到网上用quartz的比较多,所以就搜了一下.参考:http://blog.cs ...

  4. Quartz定时器的时间设置

    Quartz   定时器的时间设置 时间的配置如下:<value>0 26 16 * * ?</value>  时间大小由小到大排列,从秒开始,顺序为 秒,分,时,天,月,年 ...

  5. 第9章 Quartz定时器和发送Email

    开心一笑 [从年初的一无所有,到年终的身无分文,唉,我这不忘初心...] 新书购买 戳图购买 >>> 9.1 使用Quartz定时器 9.1.1 Quartz概述 Quartz是一个 ...

  6. 个人博客系统开发总结之 quartz定时器

    一个可以自己配置,即配即用的quartz定时器封装. pom.xml配置 <!-- https://mvnrepository.com/artifact/org.quartz-scheduler ...

  7. Quartz定时器与定时任务知识概括

    Quartz定时器与定时任务知识概括 定时任务调度 其他定时器 Quartz简介 Quartz简单入门 Spring和Quartz集成 SSMM和Quartz集成 Quartz集群 Quartz配置 ...

  8. java定时器、Spring定时器和Quartz定时器

    当前java程序中能够实现定时的主要有三种方式,分别是:java定时器,spring定时器,quartz定时器. 下面依次讲讲他们的应用! java定时器的应用    其实java很早就有解决定时器任 ...

  9. quartz定时器依赖_Grails集成Quartz插件实现定时任务(Job)

    build.gradle依赖: //定时器 compile 'org.grails.plugins:quartz:2.0.0.M4' 创建一个job,执行命令: create-job com.test ...

  10. bootstrap 数据加载中提示_解决Quartz定时器中查询懒加载数据no session的问题

    作者:下一秒升华 出自:CSDN 原文:blog.csdn.net/u013815546/article/details/53032445 相信大家在web开发过程中一定遇到过一种情况,Class班级 ...

最新文章

  1. 面试官:说说微信和淘宝扫码登录背后的实现原理?
  2. css文字背景虚化,通过实现背景模糊、文字颜色流光渐变、边框扩展等效果学习transition、transform、@keyframes等属性及伪元素的使用...
  3. (诊断)No module named MySQLdb
  4. php输出mysqli查询出来的结果
  5. java文本检索pdf,pdfsearch pdf文件的关键字搜索引擎,采用lucene,pdfbox等技术实现的 Jsp/Servlet 256万源代码下载- www.pudn.com...
  6. unzip 解压_每天一条Linux命令(11) unzip (超详细)
  7. C语言——二分法查找一个数_数组
  8. 电池的寿命(信息学奥赛一本通-T1229)
  9. mysql 用户与数据_MySQL经验9-用户和数据安全
  10. fpga一个按键控制跑马灯启停_车上这些开关都认识吗?一次带你认清车上按键...
  11. Maven Oracle JDBC
  12. linux下自动补全问题: autocomplete sh: ( compgen -d — ” ): No such file or directory
  13. 【Flutter】基础组件【09】Button
  14. 【板栗糖GIS】如何重复利用arcmap图层的符号样式
  15. UE4 UE4 C++ Gameplay Abilities的GameplayCue
  16. 从现在开始探索工业元宇宙讲座发言稿 34500字
  17. 解决加载libqxcb.so失败以及Linux库搜索顺序
  18. 区块链行业感受及近期的一些规划
  19. cnki 爬虫类论文 推荐
  20. CRMEB知识付费系统安装搭建【常见问题-19.支付宝支付报错invalid [default store dir]: /tmp/】

热门文章

  1. GAN里面的Kullback-Leibler Divergence和Jensen–Shannon Divergence
  2. 播放抓取的H263 RTP视频
  3. 浅谈BeanDefinition、BeanDefinitionMap、RootBeanDefintion三者的关系
  4. python清理浏览器文件_URL可以在浏览器或wget中正常工作,但是从Python或cURL中清空...
  5. 浏览器资源嗅探器_浏览器嗅探条件注释
  6. python中fg是什么意思_Python fg
  7. 基于机器学习和深度学习的推荐系统实战【图书推荐、电影推荐、音乐推荐】
  8. Jetson nano jetpack4.5安装torch1.8.0 yolov5(遇到到报错和解决办法)
  9. 广东省惠州市谷歌卫星地图下载
  10. Android移动开发基础案例教程 第2章 Android UI开发