java spring boot quartz编程式页面配置定时任务的使用

api文档 

中文文档:https://www.w3cschool.cn/quartz_doc/

英文文档:http://www.quartz-scheduler.org 

Maven依赖

<dependency>
    <groupId>org.quartz-scheduler</groupId>
    <artifactId>quartz</artifactId>
    <version>2.3.2</version>
</dependency> 

 表设计

/*
Navicat MySQL Data Transfer

Source Server         : 192.168.3.58_3306
Source Server Version : 50636
Source Host           : 192.168.3.58:3306
Source Database       : bhudy

Target Server Type    : MYSQL
Target Server Version : 50636
File Encoding         : 65001

Date: 2019-11-29 11:53:07
*/

SET FOREIGN_KEY_CHECKS=0;

-- ----------------------------
-- Table structure for  crontab
-- ----------------------------
DROP TABLE IF EXISTS `crontab`;
CREATE TABLE `crontab` (
  `id` varchar(64) NOT NULL COMMENT 'Id uuid',
  `name` varchar(255) DEFAULT NULL COMMENT '任务名',
  `cron_time` varchar(255) DEFAULT NULL COMMENT 'cron表达式时间',
  `is_open` int(11) DEFAULT NULL COMMENT '是否打开',
  `is_system` int(11) DEFAULT NULL COMMENT '0 是系统自带任务 1是其他用户创建',
  `is_repeat` int(11) DEFAULT NULL COMMENT '是否有配置cron 表达式 是否重复执行 0执行一次 1有cron表达需要重复执行',
  `start_time` datetime DEFAULT NULL COMMENT '当前任务开始时间',
  `crontab_type_id` varchar(64) DEFAULT NULL COMMENT '任务类型id',
  `task_status` int(11) DEFAULT NULL COMMENT '任务执行状态 : 0 正常 1 异常 2 执行中',
  `status` int(11) DEFAULT NULL COMMENT '状态(0正常 1删除 2停用 3冻结)',
  `create_by` varchar(64) DEFAULT NULL COMMENT '创建者',
  `create_date` datetime DEFAULT NULL COMMENT '创建时间',
  `update_by` varchar(64) DEFAULT NULL COMMENT '更新者',
  `update_date` datetime DEFAULT NULL COMMENT '更新时间',
  `remark` varchar(500) DEFAULT NULL COMMENT '备注信息',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='任务表';

-- ----------------------------
-- Records of  crontab
-- ----------------------------
INSERT INTO ` crontab` VALUES ('test1', 'test_1', '1/10 * * * * ? *', '0', '0', '1', '2019-11-04 15:53:07', 'testQuartzUUid', '0', '0', '1', '2019-11-04 15:53:44', '1', '2019-11-04 15:53:49', null);

-- ----------------------------
-- Table structure for  crontab_type
-- ----------------------------
DROP TABLE IF EXISTS `crontab_type`;
CREATE TABLE `crontab_type` (
  `id` varchar(64) NOT NULL COMMENT 'Id uuid',
  `name` varchar(255) DEFAULT NULL COMMENT '名称',
  `job_class_name` varchar(255) DEFAULT NULL COMMENT 'job对应class',
  `status` int(11) DEFAULT NULL COMMENT '状态(0正常 1删除 2停用 3冻结)',
  `create_by` varchar(64) DEFAULT NULL COMMENT '创建者',
  `create_date` datetime DEFAULT NULL COMMENT '创建时间',
  `update_by` varchar(64) DEFAULT NULL COMMENT '更新者',
  `update_date` datetime DEFAULT NULL COMMENT '更新时间',
  `remark` varchar(500) DEFAULT NULL COMMENT '备注信息',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='任务类型表';

-- ----------------------------
-- Records of  crontab_type
-- ----------------------------
INSERT INTO ` crontab_type` VALUES ('testQuartzUUid', 'TestQuartz', 'com.bhudy.quartz.TestQuartz', '0', '1', '2019-11-04 15:51:10', '1', '2019-11-04 15:51:12', 'test'); 

CrontabService

import com.bhudy.base.BaseService;
import com.bhudy.entity.BhudyCrontab;
import org.quartz.SchedulerException;

import java.io.Serializable;
import java.util.Date;

/**
 * @Author 变红叶
 * @Description BhudyCrontabService
 * @Date Mon Nov 04 14:28:07 CST 2019
 */
public interface BhudyCrontabService extends BaseService<BhudyCrontab, Serializable> {

    void startQuartzJobAll();

    void createCrontabJob(BhudyCrontab bhudyCrontab) throws Exception;

    void addQuartzJob(String jobName, Class jobClass, Date startTime, String resCrontabId) throws SchedulerException;

    void addQuartzJob(String jobName, Class jobClass, String time, String resCrontabId) throws SchedulerException;

    void removeQuartzJob(String resCrontabId) throws SchedulerException;

    void modifyQuartzJobTime(String crontabId) throws Exception;

}

CrontabServiceImpl实现类

import com.bhudy.base.BaseServiceImpl;
import com.bhudy.base.QueryFilter;
import com.bhudy.entity.BhudyCrontab;
import com.bhudy.service.BhudyCrontabService;
import com.bhudy.service.BhudyCrontabTypeService;
import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.io.Serializable;
import java.util.Date;
import java.util.List;

import static org.quartz.CronScheduleBuilder.cronSchedule;
import static org.quartz.JobBuilder.newJob;
import static org.quartz.SimpleScheduleBuilder.simpleSchedule;
import static org.quartz.TriggerBuilder.newTrigger;

/**
 * @Author 变红叶
 * @Description BhudyCrontabServiceImpl
 * @Date Mon Nov 04 14:28:07 CST 2019
 */
@Service
public class BhudyCrontabServiceImpl extends BaseServiceImpl<BhudyCrontab, Serializable> implements BhudyCrontabService {

    @Autowired
    private BhudyCrontabTypeService bhudyCrontabTypeService;
    private QueryFilter queryFilter = new QueryFilter();
    private static SchedulerFactory gSchedulerFactory = new StdSchedulerFactory();
    private static Scheduler sched;

    static {
        if (sched == null) {
            try {
                sched = gSchedulerFactory.getScheduler();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    @Override
    public void startQuartzJobAll() {
        queryFilter.clear().and("status", 0);
        List<BhudyCrontab> bhudyCrontabList = super.findList(queryFilter);
        if (bhudyCrontabList != null && bhudyCrontabList.size() != 0) {
            for (BhudyCrontab bhudyCrontab : bhudyCrontabList) {
                try {
                    this.createCrontabJob(bhudyCrontab);
                } catch (Exception e) {
                    bhudyCrontab.setTaskStatus(1);
                    super.update(bhudyCrontab);
                    e.printStackTrace();
                }
            }
        }
    }

    /**
     * 新增任务 调用方法
     */
    @Override
    public void createCrontabJob(BhudyCrontab bhudyCrontab) throws Exception {
        if (bhudyCrontab.getIsOpen() == 1) return;
        // 找到当前任务类型对应class
        Class cls = bhudyCrontabTypeService.checkJobClass(bhudyCrontab.getBhudyCrontabTypeId());

        //每次都是动态的根据表中用户配置
        if (bhudyCrontab.getIsRepeat() == 0) {
            // 等于0 只执行一次
            addQuartzJob(bhudyCrontab.getName(), cls, bhudyCrontab.getStartTime(), bhudyCrontab.getId());
        } else {
            //否则是需要利用cron 表达式执行的任务
            addQuartzJob(bhudyCrontab.getName(), cls, bhudyCrontab.getCronTime(), bhudyCrontab.getId());
        }
    }

    /**
     * @param jobName   任务名
     * @param jobClass  任务
     * @param startTime 时间设置 当前任务不重复执行开始时间
     */
    @Override
    public void addQuartzJob(String jobName, Class jobClass, Date startTime, String resCrontabId) throws SchedulerException {
        JobDetail jobDetail = newJob(jobClass).build();
        Trigger trigger = newTrigger()
                .withIdentity(resCrontabId)
                .usingJobData(BhudyCrontab.JOB_NAME, jobName)
                .usingJobData(BhudyCrontab.CRONTAB_ID, resCrontabId)
                .withSchedule(simpleSchedule())
                .startAt(startTime).build();
        sched.scheduleJob(jobDetail, trigger);
        // 启动
        if (!sched.isShutdown()) {
            sched.start();
        }
    }

    /**
     * @param jobName  任务名
     * @param jobClass 对应任务 jobClass
     * @param time     cron表达式
     * @Description: 添加一个定时任务
     */
    @Override
    public void addQuartzJob(String jobName, Class jobClass, String time, String resCrontabId) throws SchedulerException {
        // JobDetail jobDetail = newJob(jobClass).withIdentity(jobName, GROUP_NAME).build();// 任务名,任务组,任务执行类
        JobDetail jobDetail = newJob(jobClass).build();
        // 触发器
        Trigger trigger = newTrigger()
                .withIdentity(resCrontabId)
                //把一些 任务 key - value 存到当前任务中 例如备注
                .usingJobData(BhudyCrontab.JOB_NAME, jobName)
                .usingJobData(BhudyCrontab.CRONTAB_ID, resCrontabId)
                .withSchedule(cronSchedule(time)).startNow().build();
        sched.scheduleJob(jobDetail, trigger);
        // 启动
        if (!sched.isShutdown()) {
            sched.start();
        }
    }

    /**
     * @param resCrontabId
     * @Description: 移除一个任务(使用默认的任务组名触发器名触发器组名)
     */
    @Override
    public void removeQuartzJob(String resCrontabId) throws SchedulerException {
        sched.pauseTrigger(TriggerKey.triggerKey(resCrontabId));// 停止触发器
        sched.unscheduleJob(TriggerKey.triggerKey(resCrontabId));// 移除触发器
        //上面两个api 有可能已经删除了对应job
        Trigger trigger = sched.getTrigger(TriggerKey.triggerKey(resCrontabId));
        if (trigger != null) {
            sched.deleteJob(trigger.getJobKey());// 删除任务
        }
    }

    /**
     * @Description: 修改一个任务的触发时间
     */
    @Override
    public void modifyQuartzJobTime(String crontabId) throws Exception {
        BhudyCrontab bhudyCrontab = super.get(crontabId);
        //获取当前 jobName 和组下的trigger
        Trigger trigger = sched.getTrigger(TriggerKey.triggerKey(crontabId));
        if (trigger != null) {
            //如果当前任务不存在
            removeQuartzJob(crontabId);
        }
        createCrontabJob(bhudyCrontab);
    }

} 

调用方法

import com.bhudy.entity.BhudyCrontab;
import org.quartz.Job;
import org.quartz.JobDataMap;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.stereotype.Component;

/**
 * 变红叶
 * Created by Administrator on 2019/11/4/004.
 */
@Component
public class TestQuartz implements Job {

    @Override
    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
        JobDataMap jobDataMap = jobExecutionContext.getTrigger().getJobDataMap();
        String bhudyCrontabId = jobDataMap.getString(BhudyCrontab.CRONTAB_ID);
        System.out.println(bhudyCrontabId);
    }
}

监听器里面启动定时器

import com.bhudy.service.BhudyCrontabService;
import com.bhudy.service.KtrInfoService;
import com.bhudy.utils.Utils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.context.support.WebApplicationContextUtils;

import javax.servlet.*;
import javax.servlet.annotation.WebListener;
import java.net.InetAddress;
import java.net.UnknownHostException;

/**
 * @Author 变红叶
 * @Description 监听器
 * @Date 2019-10-30 23:09:37
 */
@WebListener
public class BhudyListener implements ServletContextListener {

    @Value("${bhudy.routerControl}")
    private Integer routerControl;

    @Override
    public void contextInitialized(ServletContextEvent sce) {
        // 启动所有定时器
        // BhudyCrontabService bhudyCrontabService = Utils.getBean(BhudyCrontabService.class);
        bhudyCrontabService.startQuartzJobAll();
    }

    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        System.out.println("FirstListener:Servlet容器被销毁了");
    }

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值