springboot整合quartz实现定时任务

一.引入依赖

 		 <dependency>
	         <groupId>org.springframework.boot</groupId>
	         <artifactId>spring-boot-starter-quartz</artifactId>
 		 </dependency>
   <!-- 该依赖必加,里面有spring对schedule的支持 -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context-support</artifactId>
         <version>4.1.6.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.quartz-scheduler</groupId>
            <artifactId>quartz</artifactId>
            <version>2.2.1</version>
        </dependency>

二.在resources目录下新建quartz.properties文件(命名必须这个)

内容如下:

# Default Properties file for use by StdSchedulerFactory
# to create a Quartz Scheduler Instance, if a different
# properties file is not explicitly specified.
#

#默认或是自己改名字都行
org.quartz.scheduler.instanceName: DefaultQuartzScheduler

#如果使用集群,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
#============================================================================
# Configure JobStore
#============================================================================

#内存方式
#org.quartz.jobStore.class: org.quartz.simpl.RAMJobStore

#存储方式使用JobStoreTX,也就是数据库
org.quartz.jobStore.class:org.quartz.impl.jdbcjobstore.JobStoreTX
org.quartz.jobStore.driverDelegateClass:org.quartz.impl.jdbcjobstore.StdJDBCDelegate
#使用自己的配置文件
org.quartz.jobStore.useProperties:true
#数据库中quartz表的表名前缀
org.quartz.jobStore.tablePrefix:qrtz_
org.quartz.jobStore.dataSource:qzDS
#是否使用集群(如果项目只部署到 一台服务器,就不用了)
org.quartz.jobStore.isClustered = true

#============================================================================
# Configure Datasources
#============================================================================
#配置数据源
org.quartz.dataSource.qzDS.driver:com.mysql.cj.jdbc.Driver
org.quartz.dataSource.qzDS.URL:jdbc:mysql://localhost:3306/quartz?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai&autoReconnect=true&allowMultiQueries=true&useSSL=false
org.quartz.dataSource.qzDS.user:root
org.quartz.dataSource.qzDS.password:root
org.quartz.dataSource.qzDS.maxConnection:10

三.在项目中添加执行任务的内容

可以添加多个任务,

@Component
public class JobTest implements Job {
    @Autowired
    private MyQuartzJobController myQuartzJobController;

    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
		//需要执行的内容体
        System.out.println("执行了");
    }
}

四.添加配置文件

第一个:

@Component
public class MyJobFactory extends AdaptableJobFactory {
    @Autowired
    private AutowireCapableBeanFactory capableBeanFactory;

    @Override
    protected Object createJobInstance(TriggerFiredBundle bundle) throws Exception {
        Object jobInstance = super.createJobInstance(bundle);
        capableBeanFactory.autowireBean(jobInstance); //这一步解决不能spring注入bean的问题
        return jobInstance;
    }
}

第二个:

@Configuration
public class QuartzConfigration {
    @Autowired
    private MyJobFactory myJobFactory;  //自定义的factory

    //指定quartz.properties
    @Bean
    public Properties quartzProperties() throws IOException {
        PropertiesFactoryBean propertiesFactoryBean = new PropertiesFactoryBean();
        propertiesFactoryBean.setLocation(new ClassPathResource("/quartz.properties"));
        propertiesFactoryBean.afterPropertiesSet();
        return propertiesFactoryBean.getObject();
    }



    //获取工厂bean
    @Bean
    public SchedulerFactoryBean schedulerFactoryBean() {
        SchedulerFactoryBean schedulerFactoryBean = new SchedulerFactoryBean();
        try {
            schedulerFactoryBean.setQuartzProperties(quartzProperties());
            schedulerFactoryBean.setJobFactory(myJobFactory);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return schedulerFactoryBean;
    }

    //创建schedule
    @Bean(name = "scheduler")
    public Scheduler scheduler() {
        return schedulerFactoryBean().getScheduler();
    }
}

五.在项目所使用的数据库中执行以下sql文件,添加相应的表:

以mysql数据库为例,执行如下语句:

#
# In your Quartz properties file, you'll need to set 
# org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.StdJDBCDelegate
#
#
# By: Ron Cordell - roncordell
#  I didn't see this anywhere, so I thought I'd post it here. This is the script from Quartz to create the tables in a MySQL database, modified to use INNODB instead of MYISAM.

DROP TABLE IF EXISTS QRTZ_FIRED_TRIGGERS;
DROP TABLE IF EXISTS QRTZ_PAUSED_TRIGGER_GRPS;
DROP TABLE IF EXISTS QRTZ_SCHEDULER_STATE;
DROP TABLE IF EXISTS QRTZ_LOCKS;
DROP TABLE IF EXISTS QRTZ_SIMPLE_TRIGGERS;
DROP TABLE IF EXISTS QRTZ_SIMPROP_TRIGGERS;
DROP TABLE IF EXISTS QRTZ_CRON_TRIGGERS;
DROP TABLE IF EXISTS QRTZ_BLOB_TRIGGERS;
DROP TABLE IF EXISTS QRTZ_TRIGGERS;
DROP TABLE IF EXISTS QRTZ_JOB_DETAILS;
DROP TABLE IF EXISTS QRTZ_CALENDARS;

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) 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 NULL,
PRIMARY KEY (SCHED_NAME,JOB_NAME,JOB_GROUP))
ENGINE=InnoDB;

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) NULL,
NEXT_FIRE_TIME BIGINT(13) NULL,
PREV_FIRE_TIME BIGINT(13) NULL,
PRIORITY INTEGER NULL,
TRIGGER_STATE VARCHAR(16) NOT NULL,
TRIGGER_TYPE VARCHAR(8) NOT NULL,
START_TIME BIGINT(13) NOT NULL,
END_TIME BIGINT(13) NULL,
CALENDAR_NAME VARCHAR(200) NULL,
MISFIRE_INSTR SMALLINT(2) NULL,
JOB_DATA BLOB NULL,
PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),
FOREIGN KEY (SCHED_NAME,JOB_NAME,JOB_GROUP)
REFERENCES QRTZ_JOB_DETAILS(SCHED_NAME,JOB_NAME,JOB_GROUP))
ENGINE=InnoDB;

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),
FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
REFERENCES QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP))
ENGINE=InnoDB;

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(120) NOT NULL,
TIME_ZONE_ID VARCHAR(80),
PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),
FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
REFERENCES QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP))
ENGINE=InnoDB;

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) NULL,
    STR_PROP_2 VARCHAR(512) NULL,
    STR_PROP_3 VARCHAR(512) NULL,
    INT_PROP_1 INT NULL,
    INT_PROP_2 INT NULL,
    LONG_PROP_1 BIGINT NULL,
    LONG_PROP_2 BIGINT NULL,
    DEC_PROP_1 NUMERIC(13,4) NULL,
    DEC_PROP_2 NUMERIC(13,4) NULL,
    BOOL_PROP_1 VARCHAR(1) NULL,
    BOOL_PROP_2 VARCHAR(1) NULL,
    PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),
    FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP) 
    REFERENCES QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP))
ENGINE=InnoDB;

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 NULL,
PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),
INDEX (SCHED_NAME,TRIGGER_NAME, TRIGGER_GROUP),
FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
REFERENCES QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP))
ENGINE=InnoDB;

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;

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;

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 INTEGER NOT NULL,
STATE VARCHAR(16) NOT NULL,
JOB_NAME VARCHAR(200) NULL,
JOB_GROUP VARCHAR(200) NULL,
IS_NONCONCURRENT VARCHAR(1) NULL,
REQUESTS_RECOVERY VARCHAR(1) NULL,
PRIMARY KEY (SCHED_NAME,ENTRY_ID))
ENGINE=InnoDB;

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;

CREATE TABLE QRTZ_LOCKS (
SCHED_NAME VARCHAR(120) NOT NULL,
LOCK_NAME VARCHAR(40) NOT NULL,
PRIMARY KEY (SCHED_NAME,LOCK_NAME))
ENGINE=InnoDB;

CREATE INDEX IDX_QRTZ_J_REQ_RECOVERY ON QRTZ_JOB_DETAILS(SCHED_NAME,REQUESTS_RECOVERY);
CREATE INDEX IDX_QRTZ_J_GRP ON QRTZ_JOB_DETAILS(SCHED_NAME,JOB_GROUP);

CREATE INDEX IDX_QRTZ_T_J ON QRTZ_TRIGGERS(SCHED_NAME,JOB_NAME,JOB_GROUP);
CREATE INDEX IDX_QRTZ_T_JG ON QRTZ_TRIGGERS(SCHED_NAME,JOB_GROUP);
CREATE INDEX IDX_QRTZ_T_C ON QRTZ_TRIGGERS(SCHED_NAME,CALENDAR_NAME);
CREATE INDEX IDX_QRTZ_T_G ON QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_GROUP);
CREATE INDEX IDX_QRTZ_T_STATE ON QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_STATE);
CREATE INDEX IDX_QRTZ_T_N_STATE ON QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP,TRIGGER_STATE);
CREATE INDEX IDX_QRTZ_T_N_G_STATE ON QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_GROUP,TRIGGER_STATE);
CREATE INDEX IDX_QRTZ_T_NEXT_FIRE_TIME ON QRTZ_TRIGGERS(SCHED_NAME,NEXT_FIRE_TIME);
CREATE INDEX IDX_QRTZ_T_NFT_ST ON QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_STATE,NEXT_FIRE_TIME);
CREATE INDEX IDX_QRTZ_T_NFT_MISFIRE ON QRTZ_TRIGGERS(SCHED_NAME,MISFIRE_INSTR,NEXT_FIRE_TIME);
CREATE INDEX IDX_QRTZ_T_NFT_ST_MISFIRE ON QRTZ_TRIGGERS(SCHED_NAME,MISFIRE_INSTR,NEXT_FIRE_TIME,TRIGGER_STATE);
CREATE INDEX IDX_QRTZ_T_NFT_ST_MISFIRE_GRP ON QRTZ_TRIGGERS(SCHED_NAME,MISFIRE_INSTR,NEXT_FIRE_TIME,TRIGGER_GROUP,TRIGGER_STATE);

CREATE INDEX IDX_QRTZ_FT_TRIG_INST_NAME ON QRTZ_FIRED_TRIGGERS(SCHED_NAME,INSTANCE_NAME);
CREATE INDEX IDX_QRTZ_FT_INST_JOB_REQ_RCVRY ON QRTZ_FIRED_TRIGGERS(SCHED_NAME,INSTANCE_NAME,REQUESTS_RECOVERY);
CREATE INDEX IDX_QRTZ_FT_J_G ON QRTZ_FIRED_TRIGGERS(SCHED_NAME,JOB_NAME,JOB_GROUP);
CREATE INDEX IDX_QRTZ_FT_JG ON QRTZ_FIRED_TRIGGERS(SCHED_NAME,JOB_GROUP);
CREATE INDEX IDX_QRTZ_FT_T_G ON QRTZ_FIRED_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP);
CREATE INDEX IDX_QRTZ_FT_TG ON QRTZ_FIRED_TRIGGERS(SCHED_NAME,TRIGGER_GROUP);

commit; 

六.编写实体类,用来接收前台传过来的相应参数和自定义的内容(对应的表结构也同样)

@Entity
@Table(name = "c_schedule_triggers")
@Data
public class MyQuartzJobPO {

    @Id
    @GenericGenerator(name = "mysqlNative", strategy = "native")
    @GeneratedValue(generator = "mysqlNative")
    private Integer id;

    @Column(columnDefinition = "varchar(50) NOT NULL comment '时间表达式'")
    private String cron;

    @Column(columnDefinition = "smallint(2) default 0 comment '使用状态 0:禁用   1:启用'")
    private Integer status;

    @Column(columnDefinition = "varchar(50) NOT NULL comment '任务名称'")
    private String jobName;

    @Column(columnDefinition = "varchar(50) NOT NULL comment '任务分组'")
    private String jobGroup;

七.编写controller,service,impl类代码:如下

controller:

@RestController
@RequestMapping(value = "/job")
@Api(value = "定时任务管理的API", description = "定时任务的CRUD操作")
public class MyQuartzJobController {

    @Autowired
    private QuartzService quartzService;

    @Autowired
    private MyQuartzJobRepository myQuartzJobRepository;

    @ApiOperation(value = "新增定时任务", notes = "新增定时任务 ", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
    @ApiImplicitParams({
            @ApiImplicitParam(name = "vo", value = "定时任务的vo", required = true, dataType = "MyQuartzJobRequestVO")
    })
    @ResponseBody
    @RequestMapping(value = "/add", method = RequestMethod.POST)
    public Map<String, Object> add(@RequestBody @Valid MyQuartzJobRequestVO vo){
        Map<String, Object> map = new HashMap<String, Object>();
        //判断重复
        //保存
        MyQuartzJobPO po = new MyQuartzJobPO();
        BeanUtils.copyProperties(vo, po);
        myQuartzJobRepository.save(po);
        map.put("msg","success");
        return map;
    }

    @ApiOperation(value = "刷新定时任务", notes = "刷新定时任务 ", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
    @ResponseBody
    @RequestMapping(value = "/refresh", method = RequestMethod.GET)
    public Map<String, Object> reflash(){
        Map<String, Object> map = new HashMap<String, Object>();
        quartzService.refreshJob();
        map.put("msg","success");
        return map;
    }

    @ApiOperation(value = "启动定时任务", notes = "启动定时任务 ", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
    @ApiImplicitParams({
            @ApiImplicitParam(name = "vo", value = "定时任务的vo", required = true, dataType = "MyQuartzJobRequestVO")
    })
    @ResponseBody
    @RequestMapping(value = "/start", method = RequestMethod.PUT)
    public Map<String, Object> start(@RequestBody MyQuartzJobRequestVO vo){
        Map<String, Object> map = new HashMap<String, Object>();
        //判断状态
        //保存
        MyQuartzJobPO po = new MyQuartzJobPO();
        BeanUtils.copyProperties(vo, po);
        myQuartzJobRepository.save(po);

        quartzService.start(vo.getJobName(), vo.getJobGroup(), vo.getCron());
        map.put("msg","success");
        return map;
    }

    @ApiOperation(value = "暂停定时任务", notes = "暂停定时任务 ", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
    @ApiImplicitParams({
            @ApiImplicitParam(name = "vo", value = "定时任务的vo", required = true, dataType = "MyQuartzJobRequestVO")
    })
    @ResponseBody
    @RequestMapping(value = "/stop", method = RequestMethod.PUT)
    public Map<String, Object> stop(@RequestBody MyQuartzJobRequestVO vo){
        Map<String, Object> map = new HashMap<String, Object>();
        //修改状态
        MyQuartzJobPO po = new MyQuartzJobPO();
        BeanUtils.copyProperties(vo, po);
        myQuartzJobRepository.save(po);
        quartzService.stop(vo.getJobName(), vo.getJobGroup());
        map.put("msg","success");
        return map;
    }

    @ApiOperation(value = "立即执行一次定时任务", notes = "立即执行一次定时任务 ", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
    @ApiImplicitParams({
            @ApiImplicitParam(name = "vo", value = "定时任务的vo", required = true, dataType = "MyQuartzJobRequestVO")
    })
    @ResponseBody
    @RequestMapping(value = "/execute", method = RequestMethod.PUT)
    public Map<String, Object> execute(@RequestBody MyQuartzJobRequestVO vo){
        Map<String, Object> map = new HashMap<String, Object>();
        quartzService.execute(vo.getJobName(), vo.getJobGroup());
        map.put("msg","success");
        return map;
    }

    @ApiOperation(value = "删除定时任务", notes = "删除定时任务 ", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
    @ApiImplicitParams({
            @ApiImplicitParam(name = "vo", value = "定时任务的vo", required = true, dataType = "MyQuartzJobRequestVO")
    })
    @ResponseBody
    @RequestMapping(value = "/delete", method = RequestMethod.DELETE)
    public Map<String, Object> delete(@RequestBody MyQuartzJobRequestVO vo){
        Map<String, Object> map = new HashMap<String, Object>();
        //删除
        MyQuartzJobPO po = new MyQuartzJobPO();
        BeanUtils.copyProperties(vo, po);
        myQuartzJobRepository.delete(po);
        quartzService.delete(vo.getJobName(), vo.getJobGroup());
        map.put("msg","success");
        return map;
    }
}

service:

public interface QuartzService {

    /**
     * @Author : maichaojiu
     * @Description : 刷新所有定时任务
     * Date : 2018/4/8 11:41
     */
    public void refreshJob();

    /**
     * @Author : maichaojiu
     * @Description : 添加定时任我游
     * Date : 2018/4/8 15:10
     */
    public boolean add(String name, String group, String cron);

    /**
     * @Author : maichaojiu
     * @Description : 启动定时任务
     * Date : 2018/4/8 11:45
     */
    public boolean start(String name, String group, String cron);

    /**
     * @Author : maichaojiu
     * @Description : 停止定时任务
     * Date : 2018/4/8 11:46
     */
    public boolean stop(String name, String group);

    /**
     * @Author : maichaojiu
     * @Description : 立即执行一次定时任务
     * Date : 2018/4/8 11:46
     */
    public boolean execute(String name, String group);

    /**
     * @Author : maichaojiu
     * @Description : 删除定时任务
     * Date : 2018/4/8 11:47
     */
    public boolean delete(String name, String group);

    /**
     * @Author : maichaojiu
     * @Description : 修改定时任务时间
     * Date : 2018/4/8 14:16
     */
    public boolean modify(String name, String group, String cron);
}

serviceImpl:

@Service
public class QuartzServiceImpl implements QuartzService {

    private static final Logger logger =  LoggerFactory.getLogger(QuartzServiceImpl.class);
    @Autowired
    private Scheduler scheduler;

    @Autowired
    private MyQuartzJobRepository myQuartzJobRepository;

    /**
     * @Author : maichaojiu
     * @Description : 刷新所有定时任务
     * Date : 2018/4/8 11:41
     */
    public void refreshJob() {
        try {
            //查询出数据库中所有的定时任务
            List<MyQuartzJobPO> jobList = myQuartzJobRepository.findAll();
            if(null != jobList && jobList.size() > 0){
                for(MyQuartzJobPO po : jobList){
                    Integer status = po.getStatus(); //该任务触发器目前的状态
                    TriggerKey triggerKey = TriggerKey.triggerKey(po.getJobName(), po.getJobGroup());
                    CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerKey);
                    //说明本条任务还没有添加到quartz中
                    if (null == trigger) {
                        if(0 == status){ //如果是禁用,则不用创建触发器
                            continue;
                        }

                        this.add(po.getJobName(), po.getJobGroup(), po.getCron());

                    } else {  //说明查出来的这条任务,已经设置到quartz中了
                        // Trigger已存在,先判断是否需要删除,如果不需要,再判定是否时间有变化
                        if(0 == status){ //如果是禁用,从quartz中删除这条任务
                            JobKey jobKey = JobKey.jobKey(po.getJobName(), po.getJobGroup());
                            scheduler.deleteJob(jobKey);
                            continue;
                        }
                        String searchCron = po.getCron(); //获取数据库的
                        String currentCron = trigger.getCronExpression();
                        if(!searchCron.equals(currentCron)){  //说明该任务有变化,需要更新quartz中的对应的记录
                            //表达式调度构建器
                            CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(searchCron);

                            //按新的cronExpression表达式重新构建trigger
                            trigger = trigger.getTriggerBuilder().withIdentity(triggerKey)
                                    .withSchedule(scheduleBuilder).build();

                            //按新的trigger重新设置job执行
                            scheduler.rescheduleJob(triggerKey, trigger);
                        }
                    }
                }
            }
        } catch (Exception e) {
            logger.error("定时任务每日刷新触发器任务异常,在ScheduleTriggerServiceImpl的方法refreshTrigger中,异常信息:",e);
        }
    }

    /**
     * @Author : maichaojiu
     * @Description : 添加定时任务
     * Date : 2018/4/8 15:11
     */
    public boolean add(String name, String group, String cron){
        try {
            JobDetail jobDetail = JobBuilder.newJob((Class<? extends Job>) Class.forName(name))
                    .withIdentity(name, group).build();

            jobDetail.getJobDataMap().put("abc","123");

            //表达式调度构建器
            CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(cron);

            //按新的cronExpression表达式构建一个新的trigger
            CronTrigger trigger = TriggerBuilder.newTrigger().withIdentity(name, group).withSchedule(scheduleBuilder).build();

            //把trigger和jobDetail注入到调度器
            scheduler.scheduleJob(jobDetail, trigger);
        } catch (Exception e){
            System.out.println(e);
        }
        return true;
    }

    /**
     * @Author : maichaojiu
     * @Description : 启动定时任务
     * Date : 2018/4/8 11:45
     */
    public boolean start(String name, String group, String cron) {
        try {
            TriggerKey triggerKey = TriggerKey.triggerKey(name, group);
            CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerKey);
            if(null == trigger){
                this.add(name, group, cron);
            }else{
                this.modify(name, group, cron);
            }
        } catch (Exception e){
            System.out.println(e);
        }
        return true;
    }

    /**
     * @Author : maichaojiu
     * @Description : 停止定时任务
     * Date : 2018/4/8 11:46
     */
    public boolean stop(String name, String group) {
        try {
            TriggerKey triggerKey = TriggerKey.triggerKey(name, group);
            boolean b = scheduler.unscheduleJob(triggerKey);//移除触发器
        } catch (Exception e){
            System.out.println(e);
        }
        return true;
    }

    /**
     * @Author : maichaojiu
     * @Description : 立即执行一次定时任务
     * Date : 2018/4/8 11:46
     */
    public boolean execute(String name, String group) {
        try {
            JobKey jobKey = JobKey.jobKey(name, group);
            //判断任务调度器中否存在该任务
            TriggerKey triggerKey = TriggerKey.triggerKey(name, group);
            CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerKey);
            if(null != trigger){
                scheduler.triggerJob(jobKey);
            }else{
                //利用反射来执行方法
                Class<?> class1 = Class.forName(name);
                Object obj = class1.newInstance();
                Job job = (Job) obj;
                job.execute(null);
            }
        } catch (Exception e){
            System.out.println(e);
        }
        return true;
    }

    /**
     * @Author : maichaojiu
     * @Description : 删除定时任务
     * Date : 2018/4/8 11:47
     */
    public boolean delete(String name, String group)  {
        try {
            TriggerKey triggerKey = TriggerKey.triggerKey(name, group); //通过触发器名和组名获取TriggerKey
            JobKey jobKey = JobKey.jobKey(name, group);//通过任务名和组名获取JobKey
            scheduler.pauseTrigger(triggerKey); // 停止触发器
            scheduler.unscheduleJob(triggerKey);// 移除触发器
            scheduler.deleteJob(jobKey); // 删除任务
        } catch (Exception e){
            System.out.println(e);
        }
        return true;
    }

    /**
     * @Author : maichaojiu
     * @Description : 修改定时任务时间
     * Date : 2018/4/8 14:33
     */
    public boolean modify(String name, String group, String cron) {
        try {
            TriggerKey triggerKey = TriggerKey.triggerKey(name, group);//通过触发器名和组名获取TriggerKey
            CronTrigger trigger = (CronTrigger)scheduler.getTrigger(triggerKey);//通过TriggerKey获取CronTrigger
            if (trigger == null)  return true;
            String oldTime = trigger.getCronExpression();
            if (!oldTime.equalsIgnoreCase(cron)) {
                CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(trigger.getCronExpression());
                trigger = (CronTrigger)trigger.getTriggerBuilder()//重新构建trigger
                        .withIdentity(triggerKey)
                        .withSchedule(scheduleBuilder)
                        .withSchedule(CronScheduleBuilder.cronSchedule(cron))
                        .build();
                scheduler.rescheduleJob(triggerKey, trigger);//按新的trigger重新设置job执行
            }
        } catch (Exception e){
            System.out.println(e);
        }

        return true;
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值