java学习心得——Quartz 自定义定时器的操作
2021-01-16 07:15
                         标签:判断   tab   pac   int   自己的   eject   实体   fast   task    最近在邮件提醒的业务里,需要根据后台每个项目的配置定时的向项目联系人推送邮件提醒,这时我明白需要定时任务了,作为java小白,我向同事做了咨询,推荐我使用Quartz,以下便是我在项目里的学习心得。 首先配置文件: 依赖的jar包 配置文件:     以上就是我本次需求的处理,说实话,我只是在照葫芦画瓢,以后的项目之余我会逐步的去补充。 另外我和原创都是单台的服务器,所以没有考虑到集群的情况下。 原创地址:https://www.cnblogs.com/likun10579/p/10896831.html 谢谢挖坑大王的分享。@挖坑大王   java学习心得——Quartz 自定义定时器的操作 标签:判断   tab   pac   int   自己的   eject   实体   fast   task    原文地址:https://www.cnblogs.com/qzzy/p/12926439.html        
         
        
quartzManager定义自己的的定时器管理类
 1.读取数据库的定时任务的设置数据
 2.添加新的定时任务
 3.删除已取消的定时任务
 4.更新已有的定时任务

package com.imaster.admin.web.schemajob;
import com.imaster.admin.model.vo.TaskVo;
import com.imaster.admin.shared.service.version2.ExhibitorReserveExhibitionService;
import com.imaster.constant.ApplicationConfig;
import com.imaster.shared.enums.TaskTypeEnum;
import com.imaster.shared.model.ExhibitorReserveExhibition;
import org.quartz.JobDataMap;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.slf4j.Logger;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.BeanFactoryAware;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.quartz.CronTriggerBean;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
 * @Author wanghh
 * 2020/5/9 11:45
 */
public class QuartzManager implements BeanFactoryAware {
    private static final Logger logger = org.slf4j.LoggerFactory.getLogger(ApplicationConfig.SERVER_NAME);
    private Scheduler scheduler;
    private static BeanFactory beanFactory;
    @Autowired
    ExhibitorReserveExhibitionService reserveExhibitionService;
    /**
     * 定时要执行的方法类。
     */
    public void reScheduleJob() {
        // 1.读取数据库中的任务列表。
        //获取短信定时任务
        List
QuartzJobFactory 定义了具体定时任务的执行管理
所有的定时任务都会在时间点执行这个类的execute(),然后我们根据定时任务的TaskType来确定具体的任务,另外注意我这边是直接将我的参数作为taskId了,所有我传入的参数是taskId,如果可以根据自己的业务需要在TaskVO中补充自己的参数

package com.imaster.admin.web.schemajob;
import com.alibaba.fastjson.JSON;
import com.imaster.admin.model.vo.TaskVo;
import com.imaster.admin.web.biz.ExhibitorReserveBiz;
import com.imaster.constant.ApplicationConfig;
import com.imaster.shared.enums.TaskTypeEnum;
import org.quartz.Job;
import org.quartz.JobDataMap;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.slf4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
/**
 * @Author wanghh
 * 2020/5/9 12:07
 */
public class QuartzJobFactory implements Job {
    private static final Logger logger = org.slf4j.LoggerFactory.getLogger(ApplicationConfig.SERVER_NAME);
    @Autowired
    private ExhibitorReserveBiz exhibitorReserveBiz;
    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException {
        JobDataMap jobDataMap = context.getJobDetail().getJobDataMap();
        TaskVo taskVo = (TaskVo) jobDataMap.get("task");
        logger.info("定时任务开始执行。。。。。。。。。。。" + JSON.toJSONString(taskVo));
        if (TaskTypeEnum.EXHIBITOR_RESERVE.getCode().equals(taskVo.getTaskType())) {
            logger.info("zhangshangbaoming job=======" + taskVo.getTaskId());
             exhibitorReserveBiz.sendAcceptTimeEmail(taskVo.getTaskId());
            //msgSendSchemaService.sendSchemaMsg(taskVo.getTaskId());
        }
    }
}
JobAdapter 这个类其实我没有明白,只能邯郸学步,请见谅,看别人的注释吧。
package com.imaster.admin.web.schemajob;
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;
/**
 * @Author wanghh
 * 2020/5/11 10:17
 */
public class JobAdapter extends AdaptableJobFactory {
    @Autowired
    private AutowireCapableBeanFactory capableBeanFactory;
    @Override
    protected Object createJobInstance(TriggerFiredBundle bundle) throws Exception {
        //调用父类的方法
        Object jobInstance = super.createJobInstance(bundle);
        //进行注入
        capableBeanFactory.autowireBean(jobInstance);
        return jobInstance;
    }
}
TaskVo 实体类


package com.imaster.admin.model.vo;
import lombok.Data;
/**
 * @Author wanghh
 * 2020/5/9 11:50
 */
@Data
public class TaskVo {
    public String taskId;
    public String taskType;
    public String cronExpression;
    public String state;
}