SpringBoot任务定制

一丶QuartzConfig
package com.xwh.it.accessManage.scheduleTask;

import org.quartz.Scheduler;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.quartz.SchedulerFactoryBean;

@Configuration
public class QuartzConfig {

@Autowired
private AccessBusinessJobFactory accessBusinessJobFactory;

@Bean
public SchedulerFactoryBean schedulerFactoryBean() {
    SchedulerFactoryBean factory = new SchedulerFactoryBean();
    factory.setJobFactory(accessBusinessJobFactory);
    return factory;
}

@Bean
public Scheduler scheduler() {
    return schedulerFactoryBean().getScheduler();

}

}

二丶AccessBusinessJobFactory
package com.xwh.it.accessManage.scheduleTask;

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

@Component(“AccessBusinessJobFactory”)
public class AccessBusinessJobFactory extends SpringBeanJobFactory {

@Autowired
private AutowireCapableBeanFactory autowireCapableBeanFactory;

protected Object createJobInstance(TriggerFiredBundle bundle) throws Exception {
    Object object = super.createJobInstance(bundle);
    autowireCapableBeanFactory.autowireBean(object);
    return object;
}

}

三、BusinessJobService
package com.xwh.it.accessManage.service;

import com.xwh.it.accessManage.vo.AccessCollection;
import org.quartz.JobKey;
import org.quartz.SchedulerException;

public interface BusinessJobService {

void init()throws Exception;

//添加任务
void addJob(AccessCollection job)throws Exception;

//检查一个Job是否存在
boolean isExistJob(JobKey jobKey) throws SchedulerException;

//是否存在Job
boolean isExistJob(String collectionId,String collectionName) throws SchedulerException;

//检查是否是正确的cron表达式
boolean isValidExpression(String cronExpression);

//修改Job Cron时间
boolean modifyJobTriggerTime(String collectionId,String collectionName,String frequency) throws SchedulerException;

//删除Job
boolean removeJob(String collectionId,String collectionName) throws SchedulerException;

//暂停Job
boolean pauseJob(String collectionId,String collectionName) throws SchedulerException;

//恢复Job
boolean resumeJob(String collectionId,String collectionName) throws SchedulerException;

}

四、BusinessJobServiceImpl
package com.xwh.it.accessManage.service.impl;

import com.xwh.it.accessManage.mapper.AccessCollectionMapper;
import com.xwh.it.accessManage.service.BusinessJobService;
import com.xwh.it.accessManage.vo.AccessCollection;
import org.apache.commons.collections.CollectionUtils;
import org.quartz.*;
import org.quartz.impl.matchers.GroupMatcher;
import org.quartz.impl.triggers.CronTriggerImpl;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import javax.annotation.PostConstruct;
import java.util.*;
import java.util.Set;

@Service
public class BusinessJobServiceImpl implements BusinessJobService {

private Logger logger = LoggerFactory.getLogger(BusinessJobServiceImpl.class);

@Autowired
private Scheduler scheduler;

@Autowired
private AccessCollectionMapper accessCollectionMapper;

/**
 * 初始化
 * */
@PostConstruct
public void init()throws Exception{
    List<AccessCollection> jobList = accessCollectionMapper.selectScheduleTask();
    for(AccessCollection job : jobList){
        addJob(job);
    }
}

/**
 * 添加定时任务
 * */
@Override
public void addJob(AccessCollection job) throws Exception {

    logger.info("添加一个job");
    JobKey jobKey = new JobKey(job.getCollectionId().toString(),job.getCollectionName());
    logger.info("校验job是否存在");
    boolean flag = isExistJob(jobKey);
    if(flag){
        logger.error("已存在该任务,CollectionId():"+job.getCollectionId().toString()+" getCollectionName:"+job.getCollectionName());
        return;
    }

    boolean checkResult = isValidExpression(job.getFrequency());
    if(!checkResult){
        logger.error("非法的cron表达式,cron:"+job.getFrequency());
    }

    Class clazz = Class.forName(job.getBeanClass());

    JobDataMap jobDataMap = new JobDataMap();
    jobDataMap.put("task",job);

    JobDetail jobDetail = JobBuilder.newJob(clazz).withIdentity(jobKey).usingJobData(jobDataMap).build();
    TriggerKey triggerKey = new TriggerKey(job.getCollectionId().toString(),job.getCollectionName());
    CronTrigger trigger = TriggerBuilder.newTrigger().withIdentity(triggerKey).withSchedule(CronScheduleBuilder.cronSchedule(job.getFrequency())).build();
    CronTriggerImpl cronTrigger = (CronTriggerImpl) trigger;
    cronTrigger.setMisfireInstruction(CronTrigger.MISFIRE_INSTRUCTION_DO_NOTHING);
    scheduler.scheduleJob(jobDetail,cronTrigger);
    scheduler.start();
}

/**
 * 检查一个Job是否存在
 * */
@Override
public boolean isExistJob(JobKey jobKey) throws SchedulerException {
    return  CollectionUtils.isNotEmpty(scheduler.getTriggersOfJob(jobKey));
}

/**
 * 是否存在Job
 * */
@Override
public boolean isExistJob(String collectionId, String collectionName) throws SchedulerException {
    return  isExistJob(new JobKey(collectionId, collectionName));
}

/**
 * 检查是否是正确的cron表达式
 * */
@Override
public boolean isValidExpression(String cronExpression) {
    return cronExpression != null && CronExpression.isValidExpression(cronExpression);
}

/**
 * 修改Job Cron时间
 * */
@Override
public boolean modifyJobTriggerTime(String collectionId, String collectionName, String frequency) throws SchedulerException {
    boolean flag = isValidExpression(frequency);
    if(!flag){
        logger.error("不是一个正确的cron表达式");
        return false;
    }

    Set<TriggerKey> triggerKeys = scheduler.getTriggerKeys(GroupMatcher.triggerGroupStartsWith(collectionId));
    if(CollectionUtils.isEmpty(triggerKeys)){
        logger.error("找不到触发器");
        return false;
    }

    for(TriggerKey triggerKey : triggerKeys){
        scheduler.unscheduleJob(triggerKey);
    }

    TriggerKey triggerKey = new TriggerKey(collectionId,collectionName);

    CronTrigger trigger = TriggerBuilder.newTrigger().withIdentity(new TriggerKey(collectionId,collectionName))
            .withSchedule(CronScheduleBuilder.cronSchedule(frequency)).build();

    CronTriggerImpl cronTrigger = (CronTriggerImpl) trigger;
    cronTrigger.setMisfireInstruction(CronTrigger.MISFIRE_INSTRUCTION_DO_NOTHING);
    scheduler.rescheduleJob(triggerKey,cronTrigger);
    return true;
}

/**
 * 删除Job
 * */
@Override
public boolean removeJob(String collectionId, String collectionName) throws SchedulerException {
    JobKey jobKey = new JobKey(collectionId,collectionName);
    return scheduler.deleteJob(jobKey);
}

/**
 * 暂停Job
 */
@Override
public boolean pauseJob(String collectionId, String collectionName) throws SchedulerException {
    JobKey jobKey = new JobKey(collectionId, collectionName);
    scheduler.pauseJob(jobKey);
    return true;
}

/**
 * 恢复Job
 * */
@Override
public boolean resumeJob(String collectionId, String collectionName) throws SchedulerException {
    JobKey jobKey = new JobKey(collectionId, collectionName);
    scheduler.resumeJob(jobKey);
    return true;
}

}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值