spring quartz 定时任务的应用



1.首先创建:schedulerFactoryBean

 <bean id="schedulerFactoryBean"
          class="org.springframework.scheduling.quartz.SchedulerFactoryBean" />

2.添加任务:

    private static Logger logger = LoggerFactory.getLogger(QuartzManager.class);
    @Autowired
    private SchedulerFactoryBean schedulerFactoryBean;

    //添加任务
    public void addTask(List<MessageTimetaskConfig> listConfig) throws SchedulerException {
        Scheduler scheduler = schedulerFactoryBean.getScheduler();
        for (MessageTimetaskConfig timetaskConfig : listConfig) {
            //1.看任务是否已经加载
            String keyName = timetaskConfig.getId()+timetaskConfig.getTimeTaskName();
            TriggerKey triggerKey = TriggerKey.triggerKey(keyName);
            CronTrigger trigger = (CronTrigger)scheduler.getTrigger(triggerKey);
            //如果为空表示任务不存在,添加新任务
            if (null == trigger) {

                JobDetail jobDetail = JobBuilder.newJob(QuartFactory.class).withIdentity(keyName).build();
                jobDetail.getJobDataMap().put("timetaskConfig",timetaskConfig);
                //设置表达式
                CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(timetaskConfig.getCronexpression());
                //创建一个新的Tigger
                trigger = TriggerBuilder.newTrigger().withIdentity(keyName).withSchedule(cronScheduleBuilder).build();
                scheduler.scheduleJob(jobDetail,trigger);
                logger.info("添加任务:["+timetaskConfig.getTimeTaskName()+"],任务信息:["+timetaskConfig.getTimeTaskClass()+"."+timetaskConfig.getTimeTaskMethod()+"]");

            } else { //任务存在更新任务

                // Trigger已存在,那么更新相应的定时设置
                CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(timetaskConfig.getCronexpression());
                // 按新的cronExpression表达式重新构建trigger
                trigger = trigger.getTriggerBuilder().withIdentity(triggerKey).withSchedule(scheduleBuilder).build();
                // 按新的trigger重新设置job执行
                scheduler.rescheduleJob(triggerKey, trigger);
                logger.info("更新任务:["+timetaskConfig.getTimeTaskName()+"],任务信息:["+timetaskConfig.getTimeTaskClass()+"."+timetaskConfig.getTimeTaskMethod()+"]");
            }
        }
    }

3.执行任务

    //2.执行任务
    public static void invokMethod(MessageTimetaskConfig config) throws NoSuchMethodException, IllegalAccessException, InstantiationException, ClassNotFoundException, InvocationTargetException {
        Class clazz = null;
        String taskClass = config.getTimeTaskClass();
        if (!StringUtils.isEmpty(taskClass)) {
            Object clsObj = BeanUtil.getBean(config.getTimeTaskClass());
            clazz = clsObj.getClass();
            //得到指定的方法
            Method method = clazz.getDeclaredMethod(config.getTimeTaskMethod(),config.getGrabNumber().getClass());
            if (null == clsObj || null == method) {
                logger.info("方法或类名指定错误....");
                return;
            }
            //执行方法
            method.invoke(clsObj, config.getGrabNumber());
        }

    }

4.任务数据初始化

public class InitQuartzData {

    private Logger logger = LoggerFactory.getLogger(this.getClass());

    @Autowired
    private MessageTimetaskConfigDao dao;

    @Autowired
    private QuartzManager manager;

    public void initQuartz() {
        //查询全部任务数据
        List<MessageTimetaskConfig> list = (List<MessageTimetaskConfig>)dao.findBySwitch();
        if (CollectionUtils.isNotEmpty(list)) {
            //添加任务
            try {
                manager.addTask(list);
                logger.info("初始化定时任务成功");
            } catch (SchedulerException e) {
                logger.info("初始化定时任务失败:"+e.getMessage());
               // e.printStackTrace();
            }
        } else {
            logger.info("初始化定时任务失败,缺少数据");
        }

    }

    /**
     * 刷新任务数据
     */
    public void refreshQuartz() {
        BeanUtil.refreshBean(InitQuartzData.class,"initQuartzData","initQuartz");
    }


转载于:https://my.oschina.net/tima/blog/423365

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值