springboot 整合 quartz定时任务 学习

springboot + quartz定时任务 学习

第一步:

引入依赖:

              <!-- quartz 模块 -->
		      <!-- c3p0 -->
	        	<dependency>
		            	<groupId>com.mchange</groupId>
			            <artifactId>mchange-commons-java</artifactId>
		           	    <version>0.2.11</version>
		        </dependency>
	        	<dependency>
		               	<groupId>c3p0</groupId>
	            		<artifactId>c3p0</artifactId>
			            <version>0.9.1.2</version>
		        </dependency>
		        <dependency>
		            	<groupId>org.quartz-scheduler</groupId>
			            <artifactId>quartz</artifactId>
			            <version>2.2.3</version>
		        </dependency>
		        <dependency>
			            <groupId>org.quartz-scheduler</groupId>
		            	<artifactId>quartz-jobs</artifactId>
		            	<version>2.2.3</version>
		        </dependency>
     

第二步:quartz.properties文件配置

#默认或是自己改名字都行
org.quartz.scheduler.instanceName = myQuartz
#如果使用集群,instanceId必须唯一,设置成AUTO
org.quartz.scheduler.instanceId = AUTO
org.quartz.scheduler.rmi.export = false
org.quartz.scheduler.rmi.proxy = false
org.quartz.scheduler.wrapJobExecutionInUserTransaction = false


#线程池配置
org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool
org.quartz.threadPool.threadCount = 10
org.quartz.threadPool.threadPriority = 5
org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread = true


#持久化配置
org.quartz.jobStore.misfireThreshold = 60000
#存储方式使用JobStoreTX,也就是数据库
org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX
org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.StdJDBCDelegate
#使用weblogic连接Oracle驱动
#org.quartz.jobStore.driverDelegateClass: org.quartz.impl.jdbcjobstore.oracle.weblogic.WebLogicOracleDelegate

#是否使用集群(如果项目只部署到 一台服务器,就不用了)
org.quartz.jobStore.isClustered = true
#使用自己的配置文件
org.quartz.jobStore.useProperties = true
org.quartz.jobStore.clusterCheckinInterval = 20000

#数据库中quartz表的表名前缀
org.quartz.jobStore.tablePrefix = qrtz_
org.quartz.jobStore.dataSource = shiro-learning


#配置数据源,quartz默认使用c3p0数据源可以被自定义数据源覆盖
org.quartz.dataSource.shiro-learning.driver = com.mysql.jdbc.Driver
org.quartz.dataSource.shiro-learning.URL = jdbc:mysql://127.0.0.1:3306/shiro-learning
org.quartz.dataSource.shiro-learning.user = root
org.quartz.dataSource.shiro-learning.password = 123456
org.quartz.dataSource.shiro-learning.maxConnections = 10

第三步:表 schedule_table.sql 共11张表 ,我用的mysql的数据库

  SET FOREIGN_KEY_CHECKS=0;

-- ----------------------------
-- Table structure for qrtz_blob_triggers
-- ----------------------------
DROP TABLE IF EXISTS `qrtz_blob_triggers`;
CREATE TABLE `qrtz_blob_triggers` (
  `SCHED_NAME` varchar(120) NOT NULL,
  `TRIGGER_NAME` varchar(200) NOT NULL,
  `TRIGGER_GROUP` varchar(200) NOT NULL,
  `BLOB_DATA` blob,
  PRIMARY KEY (`SCHED_NAME`,`TRIGGER_NAME`,`TRIGGER_GROUP`),
  CONSTRAINT `QRTZ_BLOB_TRIGGERS_ibfk_1` FOREIGN KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) REFERENCES `qrtz_triggers` (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- ----------------------------
-- Table structure for qrtz_calendars
-- ----------------------------
DROP TABLE IF EXISTS `qrtz_calendars`;
CREATE TABLE `qrtz_calendars` (
  `SCHED_NAME` varchar(120) NOT NULL,
  `CALENDAR_NAME` varchar(200) NOT NULL,
  `CALENDAR` blob NOT NULL,
  PRIMARY KEY (`SCHED_NAME`,`CALENDAR_NAME`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- ----------------------------
-- Table structure for qrtz_cron_triggers
-- ----------------------------
DROP TABLE IF EXISTS `qrtz_cron_triggers`;
CREATE TABLE `qrtz_cron_triggers` (
  `SCHED_NAME` varchar(120) NOT NULL,
  `TRIGGER_NAME` varchar(200) NOT NULL,
  `TRIGGER_GROUP` varchar(200) NOT NULL,
  `CRON_EXPRESSION` varchar(200) NOT NULL,
  `TIME_ZONE_ID` varchar(80) DEFAULT NULL,
  PRIMARY KEY (`SCHED_NAME`,`TRIGGER_NAME`,`TRIGGER_GROUP`),
  CONSTRAINT `QRTZ_CRON_TRIGGERS_ibfk_1` FOREIGN KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) REFERENCES `qrtz_triggers` (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- ----------------------------
-- Table structure for qrtz_fired_triggers
-- ----------------------------
DROP TABLE IF EXISTS `qrtz_fired_triggers`;
CREATE TABLE `qrtz_fired_triggers` (
  `SCHED_NAME` varchar(120) NOT NULL,
  `ENTRY_ID` varchar(95) NOT NULL,
  `TRIGGER_NAME` varchar(200) NOT NULL,
  `TRIGGER_GROUP` varchar(200) NOT NULL,
  `INSTANCE_NAME` varchar(200) NOT NULL,
  `FIRED_TIME` bigint(13) NOT NULL,
  `SCHED_TIME` bigint(13) NOT NULL,
  `PRIORITY` int(11) NOT NULL,
  `STATE` varchar(16) NOT NULL,
  `JOB_NAME` varchar(200) DEFAULT NULL,
  `JOB_GROUP` varchar(200) DEFAULT NULL,
  `IS_NONCONCURRENT` varchar(1) DEFAULT NULL,
  `REQUESTS_RECOVERY` varchar(1) DEFAULT NULL,
  PRIMARY KEY (`SCHED_NAME`,`ENTRY_ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- ----------------------------
-- Table structure for qrtz_job_details
-- ----------------------------
DROP TABLE IF EXISTS `qrtz_job_details`;
CREATE TABLE `qrtz_job_details` (
  `SCHED_NAME` varchar(120) NOT NULL,
  `JOB_NAME` varchar(200) NOT NULL,
  `JOB_GROUP` varchar(200) NOT NULL,
  `DESCRIPTION` varchar(250) DEFAULT NULL,
  `JOB_CLASS_NAME` varchar(250) NOT NULL,
  `IS_DURABLE` varchar(1) NOT NULL,
  `IS_NONCONCURRENT` varchar(1) NOT NULL,
  `IS_UPDATE_DATA` varchar(1) NOT NULL,
  `REQUESTS_RECOVERY` varchar(1) NOT NULL,
  `JOB_DATA` blob,
  PRIMARY KEY (`SCHED_NAME`,`JOB_NAME`,`JOB_GROUP`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- ----------------------------
-- Table structure for qrtz_locks
-- ----------------------------
DROP TABLE IF EXISTS `qrtz_locks`;
CREATE TABLE `qrtz_locks` (
  `SCHED_NAME` varchar(120) NOT NULL,
  `LOCK_NAME` varchar(40) NOT NULL,
  PRIMARY KEY (`SCHED_NAME`,`LOCK_NAME`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- ----------------------------
-- Table structure for qrtz_paused_trigger_grps
-- ----------------------------
DROP TABLE IF EXISTS `qrtz_paused_trigger_grps`;
CREATE TABLE `qrtz_paused_trigger_grps` (
  `SCHED_NAME` varchar(120) NOT NULL,
  `TRIGGER_GROUP` varchar(200) NOT NULL,
  PRIMARY KEY (`SCHED_NAME`,`TRIGGER_GROUP`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- ----------------------------
-- Table structure for qrtz_scheduler_state
-- ----------------------------
DROP TABLE IF EXISTS `qrtz_scheduler_state`;
CREATE TABLE `qrtz_scheduler_state` (
  `SCHED_NAME` varchar(120) NOT NULL,
  `INSTANCE_NAME` varchar(200) NOT NULL,
  `LAST_CHECKIN_TIME` bigint(13) NOT NULL,
  `CHECKIN_INTERVAL` bigint(13) NOT NULL,
  PRIMARY KEY (`SCHED_NAME`,`INSTANCE_NAME`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- ----------------------------
-- Table structure for qrtz_simple_triggers
-- ----------------------------
DROP TABLE IF EXISTS `qrtz_simple_triggers`;
CREATE TABLE `qrtz_simple_triggers` (
  `SCHED_NAME` varchar(120) NOT NULL,
  `TRIGGER_NAME` varchar(200) NOT NULL,
  `TRIGGER_GROUP` varchar(200) NOT NULL,
  `REPEAT_COUNT` bigint(7) NOT NULL,
  `REPEAT_INTERVAL` bigint(12) NOT NULL,
  `TIMES_TRIGGERED` bigint(10) NOT NULL,
  PRIMARY KEY (`SCHED_NAME`,`TRIGGER_NAME`,`TRIGGER_GROUP`),
  CONSTRAINT `QRTZ_SIMPLE_TRIGGERS_ibfk_1` FOREIGN KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) REFERENCES `qrtz_triggers` (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- ----------------------------
-- Table structure for qrtz_simprop_triggers
-- ----------------------------
DROP TABLE IF EXISTS `qrtz_simprop_triggers`;
CREATE TABLE `qrtz_simprop_triggers` (
  `SCHED_NAME` varchar(120) NOT NULL,
  `TRIGGER_NAME` varchar(200) NOT NULL,
  `TRIGGER_GROUP` varchar(200) NOT NULL,
  `STR_PROP_1` varchar(512) DEFAULT NULL,
  `STR_PROP_2` varchar(512) DEFAULT NULL,
  `STR_PROP_3` varchar(512) DEFAULT NULL,
  `INT_PROP_1` int(11) DEFAULT NULL,
  `INT_PROP_2` int(11) DEFAULT NULL,
  `LONG_PROP_1` bigint(20) DEFAULT NULL,
  `LONG_PROP_2` bigint(20) DEFAULT NULL,
  `DEC_PROP_1` decimal(13,4) DEFAULT NULL,
  `DEC_PROP_2` decimal(13,4) DEFAULT NULL,
  `BOOL_PROP_1` varchar(1) DEFAULT NULL,
  `BOOL_PROP_2` varchar(1) DEFAULT NULL,
  PRIMARY KEY (`SCHED_NAME`,`TRIGGER_NAME`,`TRIGGER_GROUP`),
  CONSTRAINT `QRTZ_SIMPROP_TRIGGERS_ibfk_1` FOREIGN KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) REFERENCES `qrtz_triggers` (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- ----------------------------
-- Table structure for qrtz_triggers
-- ----------------------------
DROP TABLE IF EXISTS `qrtz_triggers`;
CREATE TABLE `qrtz_triggers` (
  `SCHED_NAME` varchar(120) NOT NULL,
  `TRIGGER_NAME` varchar(200) NOT NULL,
  `TRIGGER_GROUP` varchar(200) NOT NULL,
  `JOB_NAME` varchar(200) NOT NULL,
  `JOB_GROUP` varchar(200) NOT NULL,
  `DESCRIPTION` varchar(250) DEFAULT NULL,
  `NEXT_FIRE_TIME` bigint(13) DEFAULT NULL,
  `PREV_FIRE_TIME` bigint(13) DEFAULT NULL,
  `PRIORITY` int(11) DEFAULT NULL,
  `TRIGGER_STATE` varchar(16) NOT NULL,
  `TRIGGER_TYPE` varchar(8) NOT NULL,
  `START_TIME` bigint(13) NOT NULL,
  `END_TIME` bigint(13) DEFAULT NULL,
  `CALENDAR_NAME` varchar(200) DEFAULT NULL,
  `MISFIRE_INSTR` smallint(2) DEFAULT NULL,
  `JOB_DATA` blob,
  PRIMARY KEY (`SCHED_NAME`,`TRIGGER_NAME`,`TRIGGER_GROUP`),
  KEY `SCHED_NAME` (`SCHED_NAME`,`JOB_NAME`,`JOB_GROUP`),
  CONSTRAINT `QRTZ_TRIGGERS_ibfk_1` FOREIGN KEY (`SCHED_NAME`, `JOB_NAME`, `JOB_GROUP`) REFERENCES `qrtz_job_details` (`SCHED_NAME`, `JOB_NAME`, `JOB_GROUP`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

第四步:新建一个定时任务的存储的表,app_quartz

CREATE TABLE `app_quartz` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `job_name` varchar(255) DEFAULT NULL,
  `job_group` varchar(255) DEFAULT NULL,
  `job_description` varchar(255) DEFAULT NULL,
  `job_class_name` varchar(255) DEFAULT NULL,
  `cronExpression` varchar(255) DEFAULT NULL,
  `status` varchar(255) DEFAULT NULL,
  `old_job_name` varchar(255) DEFAULT NULL,
  `old_job_group` varchar(255) DEFAULT NULL,
  `invokeParam` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8;
 /**
       * 任务类
       * 存放定时任务基本信息和描述等信息
      */
    public class AppQuartz implements Serializable{

    private Integer id;

    private String jobName;//任务名称

    private String jobGroup;//任务分组

    private String jobDescription;//任务描述

    private String jobClassName;//执行类

    private String cronExpression;//执行时间

    private String status;//任务状态 0:禁用   1:启用

    private String oldJobName;//任务名称 用于修改

    private String oldJobGroup;//任务分组 用于修改

    private String invokeParam;//需要传递的参数

    省略get,set方法

创建job 实例工厂JobFactory

 package com.shiro_learning.demo.config.quartz;

    import org.quartz.spi.TriggerFiredBundle;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.beans.factory.config.AutowireCapableBeanFactory;
    import org.springframework.scheduling.quartz.AdaptableJobFactory;
    import org.springframework.stereotype.Component;

    /**
     * 创建job 实例工厂,解决spring注入问题,如果使用默认会导致spring的@Autowired 无法注入问题
     */
    @Component
    public class JobFactory extends AdaptableJobFactory{

     @Autowired
    private AutowireCapableBeanFactory capableBeanFactory;

    @Override
    protected Object createJobInstance(TriggerFiredBundle bundle) throws Exception {
        //调用父类的方法
        Object jobInstance = super.createJobInstance(bundle);
        //进行注入
        capableBeanFactory.autowireBean(jobInstance);
        return jobInstance;
      }
    }

创建定时任务配置类 SchedulerConfig

package com.shiro_learning.demo.config.quartz;

    import org.quartz.Scheduler;
    import org.quartz.ee.servlet.QuartzInitializerListener;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.beans.factory.annotation.Qualifier;
    import org.springframework.beans.factory.config.PropertiesFactoryBean;
    import org.springframework.context.ApplicationListener;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.context.event.ContextRefreshedEvent;
    import org.springframework.core.io.ClassPathResource;
    import org.springframework.scheduling.quartz.SchedulerFactoryBean;
    import javax.sql.DataSource;
    import java.io.IOException;
    import java.util.Properties;

    @Configuration
    public class SchedulerConfig implements ApplicationListener<ContextRefreshedEvent> {

    @Autowired
    private JobFactory jobFactory;//自定义的factory

    @Autowired
    @Qualifier("dataSource")
    private DataSource primaryDataSource;

    @Override
    public void onApplicationEvent(ContextRefreshedEvent event) {
        System.out.println("任务已经启动..."+event.getSource());
    }

    /**
     * 获取工厂的bean
     * @return
     * @throws IOException
     */
    @Bean
    public SchedulerFactoryBean schedulerFactoryBean() throws IOException {
        //获取配置属性
        PropertiesFactoryBean propertiesFactoryBean = new PropertiesFactoryBean();
        propertiesFactoryBean.setLocation(new ClassPathResource("/quartz.properties"));
        //在quartz.properties中的属性被读取并注入后再初始化对象
        propertiesFactoryBean.afterPropertiesSet();
        Properties properties = propertiesFactoryBean.getObject();
        //创建SchedulerFactoryBean
        SchedulerFactoryBean factory = new SchedulerFactoryBean();
        factory.setQuartzProperties(properties);
        //使用数据源,自定义数据源
        factory.setDataSource(this.primaryDataSource);
        factory.setJobFactory(jobFactory);
        factory.setWaitForJobsToCompleteOnShutdown(true);//这样当spring关闭时,会等待所有已经启动的quartz job结束后spring才能完全shutdown。
        factory.setOverwriteExistingJobs(false);
        //延时2秒启动
        factory.setStartupDelay(2);
        return factory;
    }


    /*
     * 通过SchedulerFactoryBean获取Scheduler的实例
     */
    @Bean(name="scheduler")
    public Scheduler scheduler() throws IOException {
        return schedulerFactoryBean().getScheduler();
    }


    /**
     * /**
     * quartz初始化监听器
     */
    @Bean
    public QuartzInitializerListener executorListener() {
        return new QuartzInitializerListener();
      }
    }

业务demo

controller:

package com.shiro_learning.demo.controller;

    import com.shiro_learning.demo.entity.AppQuartz;
    import com.shiro_learning.demo.service.IQuartzService;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestMethod;

    @Controller
    @RequestMapping("/quartz")
    public class QuartzController {
    private static Logger logger = LoggerFactory.getLogger(QuartzController.class);
    @Autowired
    private IQuartzService iQuartzService;

    /**
     * 新建任务
     * @param appQuartz
     */
    @RequestMapping(value = "/allJob", method = RequestMethod.GET)
    public void allJob(AppQuartz appQuartz) {
        //保存定时任务基本信息和描述等信AppQuartz appQuartz息
        iQuartzService.insertAppQuartz(appQuartz);
        //添加任务
        iQuartzService.addJob(appQuartz);
    }


    /**
     * 测试
     */
    @RequestMapping(value = "/test", method = RequestMethod.GET)
    public void test() {
        AppQuartz appQuartz = new AppQuartz();
        logger.info("add electricity schedule ......");
        appQuartz.setCronExpression("*/5 * * * * ?");//每隔5s执行一次
        appQuartz.setJobName("test");
        appQuartz.setJobClassName("TestJob");//定时任务执行的类
        appQuartz.setInvokeParam("");
        appQuartz.setJobGroup("test");
        appQuartz.setJobDescription("test");
        iQuartzService.insertAppQuartz(appQuartz);
        iQuartzService.addJob(appQuartz);
      }
    }

service接口:

 package com.shiro_learning.demo.service;

    import com.shiro_learning.demo.entity.AppQuartz;

    public interface IQuartzService {
           public void insertAppQuartz(AppQuartz appQuartz);
           public void addJob(AppQuartz appQuartz);
    }

service实现类:

 package com.shiro_learning.demo.service.impl;

     import com.baomidou.mybatisplus.service.impl.ServiceImpl;
     import com.shiro_learning.demo.dao.IQuartzMapper;
     import com.shiro_learning.demo.entity.AppQuartz;
     import com.shiro_learning.demo.service.IQuartzService;
     import org.apache.commons.lang3.StringUtils;
     import org.quartz.*;
     import org.slf4j.Logger;
     import org.slf4j.LoggerFactory;
     import org.springframework.beans.factory.annotation.Autowired;
     import org.springframework.beans.factory.annotation.Qualifier;
     import org.springframework.stereotype.Service;

    @Service
    public class IQuartzServiceImpl implements IQuartzService {
    private static Logger logger = LoggerFactory.getLogger(IQuartzServiceImpl.class);

    /**加入Qulifier注解,通过名称注入bean*/
    @Autowired
    @Qualifier("scheduler")
    private Scheduler scheduler;

    @Autowired
    private IQuartzMapper iQuartzMapper;


    @Override
    public void insertAppQuartz(AppQuartz appQuartz) {
        iQuartzMapper.insertAppQuartz(appQuartz);
    }

    /**
     * 添加任务
     * @param appQuartz
     */
    @Override
    public void addJob(AppQuartz appQuartz) {
        logger.debug("添加任务:"+appQuartz.toString());
        try{
            String jobName = appQuartz.getJobName();
            String jobGroup = appQuartz.getJobGroup();
            String jobDescription = appQuartz.getJobDescription();
            String jobClassName = "com.shiro_learning.demo.job."+appQuartz.getJobClassName();//包名+类名
            /**
             * 获取Scheduler实例、使用自动注入的scheduler、否则spring的service将无法注入
             * 如果是修改 ,展示旧的任务,再删除
             */
            if(StringUtils.isNotEmpty(appQuartz.getOldJobGroup())){
                JobKey jobKey = new JobKey(appQuartz.getJobName(),appQuartz.getOldJobGroup());
                scheduler.deleteJob(jobKey);
            }
            //任务执行类
            Class cls = Class.forName(jobClassName);
            cls.newInstance();

            //构建任务详情
            JobDetail jobDetail = JobBuilder.newJob(cls).withIdentity("jobDetail"+jobName,"jobDetail"+jobGroup).withDescription(jobDescription).build();

            //传参数
            jobDetail.getJobDataMap().put("job_data", appQuartz.getInvokeParam());

            //触发时间点
            CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(appQuartz.getCronExpression());

            // 创建Trigger对象
            Trigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger"+jobName,"trigger"+jobGroup).startNow().withSchedule(cronScheduleBuilder).build();

            //调度容器设置JobDetail和Trigger(交由Scheduler安排触发
            scheduler.scheduleJob(jobDetail,trigger);
            try {
                //启动
                if(!scheduler.isShutdown()){
                    scheduler.start();
                }
            }catch (SchedulerException e){
                logger.info("任务【"+appQuartz.getJobName()+"】添加失败!"+e.getMessage());
            }
        }catch (Exception e){
            e.printStackTrace();
        }
       }
    }

mapper:

 package com.shiro_learning.demo.dao;

    import com.shiro_learning.demo.entity.AppQuartz;
    import org.springframework.web.bind.annotation.RequestBody;

    //@Component
    //Mapper
    public interface IQuartzMapper {
          public void insertAppQuartz(@RequestBody AppQuartz appQuartz);
    }

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.shiro_learning.demo.dao.IQuartzMapper" >
    <resultMap id="BaseResultMap" type="com.shiro_learning.demo.entity.AppQuartz" >
        <constructor >
            <idArg column="id" jdbcType="INTEGER" javaType="java.lang.Integer" />
            <arg column="job_name" jdbcType="VARCHAR" javaType="java.lang.String" />
            <arg column="job_group" jdbcType="VARCHAR" javaType="java.lang.String" />
            <arg column="job_description" jdbcType="VARCHAR" javaType="java.lang.String" />
            <arg column="job_class_name" jdbcType="VARCHAR" javaType="java.lang.String" />
            <arg column="cronExpression" jdbcType="VARCHAR" javaType="java.lang.String" />
            <arg column="status" jdbcType="VARCHAR" javaType="java.lang.String" />
            <arg column="old_job_name" jdbcType="VARCHAR" javaType="java.lang.String" />
            <arg column="old_job_group" jdbcType="VARCHAR" javaType="java.lang.String" />
            <arg column="invokeParam" jdbcType="VARCHAR" javaType="java.lang.String" />
        </constructor>
    </resultMap>
    <sql id="Base_Column_List" >
           id,
           job_name,
           job_group,
           job_description,
           job_class_name,
           cronExpression,
           status,
           old_job_name,
           old_job_group,
           invokeParam
    </sql>
   
    <insert id="insertAppQuartz" parameterType="com.shiro_learning.demo.entity.AppQuartz" >
        insert into app_quartz (
           id,
           job_name,
           job_group,
           job_description,
           job_class_name,
           cronExpression,
           status,
           old_job_name,
           old_job_group,
           invokeParam
        )
        values (
           #{id,jdbcType=INTEGER},
           #{jobName,jdbcType=VARCHAR},
           #{jobGroup,jdbcType=VARCHAR},
           #{jobDescription,jdbcType=VARCHAR},
           #{jobClassName,jdbcType=VARCHAR},
           #{cronExpression,jdbcType=VARCHAR},
           #{status,jdbcType=VARCHAR},
           #{oldJobName,jdbcType=VARCHAR},
           #{oldJobGroup,jdbcType=VARCHAR},
           #{invokeParam,jdbcType=VARCHAR}
        )
    </insert>

</mapper>

定时执行的类 Job

 package com.shiro_learning.demo.job;

    import org.quartz.Job;
    import org.quartz.JobExecutionContext;
    import org.quartz.JobExecutionException;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;

    /**
     * 定时任务测试job类
     */
    public class TestJob implements Job {
    private static Logger logger = LoggerFactory.getLogger(TestJob.class);

	@Override
    public void execute(JobExecutionContext context) throws JobExecutionException {
           logger.info("任务执行成功");
       }
    }

测试结果

在这里插入图片描述

参考资料:

https://segmentfault.com/a/1190000016554033
https://www.cnblogs.com/drift-ice/p/3817269.html
https://blog.csdn.net/zzzffhh/article/details/80733729
https://www.cnblogs.com/superman66/p/4565723.html

发布了33 篇原创文章 · 获赞 42 · 访问量 3169

猜你喜欢

转载自blog.csdn.net/weixin_40991408/article/details/89031270