SSM整合quartz框架-动态设置定时任务的实现

maven依赖

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

spring整合配置

<bean id="jobFactory" class="hotkidclub.service.quartz.JobFactory"></bean>
<bean id="schedulerFactoryBean" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
    <property name="jobFactory" ref="jobFactory"></property>
</bean>

jobFactory

package hotkidclub.service.quartz;

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;

public class JobFactory extends AdaptableJobFactory {

   @Autowired
   private AutowireCapableBeanFactory capableBeanFactory;

   @Override
   protected Object createJobInstance(TriggerFiredBundle bundle) throws Exception {
      // 调用父类的方法
      Object jobInstance = super.createJobInstance(bundle);
      // 进行注入
      capableBeanFactory.autowireBean(jobInstance);
      return jobInstance;
   }
}

触发器

package hotkidclub.service.quartz;

import java.text.SimpleDateFormat;
import java.util.Date;

import org.quartz.CronScheduleBuilder;
import org.quartz.CronTrigger;
import org.quartz.Job;
import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.JobKey;
import org.quartz.Scheduler;
import org.quartz.Trigger;
import org.quartz.TriggerBuilder;
import org.quartz.TriggerKey;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.quartz.SchedulerFactoryBean;
import org.springframework.stereotype.Component;

/**
 * 触发器配置:动态配置定时任务
 * @author guohongen
 */
@Component
public class QuartzManager {

   private static String JOB_GROUP_NAME = "EXTJWEB_JOBGROUP_NAME";
   private static String TRIGGER_GROUP_NAME = "EXTJWEB_TRIGGERGROUP_NAME";
   // private static SchedulerFactory schedulerFactory = new StdSchedulerFactory();
   @Autowired
   private SchedulerFactoryBean schedulerFactory;

   /**
    * 添加定时触发任务
    * @param jobName 任务id:必须是唯一(对于同个模块的定时调用,例:定时推送任务的key)
    * @param date 触发时间:定时任务的定时推送时间
    * @param jobClass
    * @param objects 触发后需传递到触发执行函数的参数: 例:本后台系统的定时任务bean数据
    */
   public void addJob(String jobName, Date date, Class<? extends Job> jobClass, Object... objects) {
      try {
         SimpleDateFormat sdf = new SimpleDateFormat("ss mm HH dd MM ? yyyy");
         String cron = sdf.format(date);
         Scheduler scheduler = schedulerFactory.getScheduler();
         if (scheduler.getJobDetail(JobKey.jobKey(jobName)) != null) {
            return;
         }
         // 任务名,任务组,任务执行类
         JobDetail jobDetail = JobBuilder.newJob(jobClass).withIdentity(jobName, JOB_GROUP_NAME).build();
         if (objects != null) {
            for (int i = 0; i < objects.length; i++) {
               jobDetail.getJobDataMap().put("" + i, objects[i]);
            }
         }
         TriggerBuilder<Trigger> triggerBuilder = TriggerBuilder.newTrigger();
         // 触发器名,触发器组
         triggerBuilder.withIdentity(jobName, TRIGGER_GROUP_NAME);
         triggerBuilder.startNow();
         // 触发器时间设定
         triggerBuilder.withSchedule(CronScheduleBuilder.cronSchedule(cron));
         // 创建Trigger对象
         CronTrigger trigger = (CronTrigger) triggerBuilder.build();
         // 调度容器设置JobDetail和Trigger
         scheduler.scheduleJob(jobDetail, trigger);
         // 启动
         if (!scheduler.isShutdown()) {
            scheduler.start();
         }
      }
      catch (Exception e) {
         throw new RuntimeException(e);
      }
   }

   /**
    * 修改一个定时任务
    * 
    */
   public void modifyJobTime(String triggerName, Date date) {
      try {
         SimpleDateFormat sdf = new SimpleDateFormat("ss mm HH dd MM ? yyyy");
         String cron = sdf.format(date);
         Scheduler scheduler = schedulerFactory.getScheduler();
         TriggerKey triggerKey = TriggerKey.triggerKey(triggerName, TRIGGER_GROUP_NAME);
         CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerKey);
         if (trigger == null) {
            return;
         }
         String oldTime = trigger.getCronExpression();
         if (!oldTime.equalsIgnoreCase(cron)) {
            // 触发器
            TriggerBuilder<Trigger> triggerBuilder = TriggerBuilder.newTrigger();
            // 触发器名,触发器组
            triggerBuilder.withIdentity(triggerName, TRIGGER_GROUP_NAME);
            triggerBuilder.startNow();
            // 触发器时间设定
            triggerBuilder.withSchedule(CronScheduleBuilder.cronSchedule(cron));
            // 创建Trigger对象
            trigger = (CronTrigger) triggerBuilder.build();
            // 方式一 :修改一个任务的触发时间
            scheduler.rescheduleJob(triggerKey, trigger);
         }
      }
      catch (Exception e) {
         throw new RuntimeException(e);
      }
   }

   /**
    * 删除一个定时任务
    * 
    */
   public void removeJob(String triggerName) {
      try {
         Scheduler scheduler = schedulerFactory.getScheduler();
         TriggerKey triggerKey = TriggerKey.triggerKey(triggerName, TRIGGER_GROUP_NAME);
         // 停止触发器
         scheduler.pauseTrigger(triggerKey);
         // 移除触发器
         scheduler.unscheduleJob(triggerKey);
         // 删除任务
         scheduler.deleteJob(JobKey.jobKey(triggerName, JOB_GROUP_NAME));
      }
      catch (Exception e) {
         throw new RuntimeException(e);
      }
   }
}

任务执行器

package hotkidclub.service.quartz;

import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.stereotype.Component;

/**
 * 执行器服务: 消息定时推送执行器
 * <p>
 *     不同的业务模块需单独匹配
 * </p>
 */
@Component
public class DmeoJob implements Job {

   // TODO 消息推送服务
   // @Autowired
   // NotificationService notificationService;
   @Override
   public void execute(JobExecutionContext arg0) throws JobExecutionException {
      // mapService.mapSettlement();
      // TODO 取出触发器中传入的参数(objects),使用匹配的类型接收(例Object)
      // Object o = arg0.getJobDetail().getJobDataMap().get("0").toString();
      // TODO 执行具体业务 例: 消息推送函数(sendWeixinMsg),传入取出的参数(具体参数参考消息推送函数的参数列表声明)
      // notificationService.sendWeixinMsg(taste);
   }
}
发布了25 篇原创文章 · 获赞 10 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/weixin_37794901/article/details/104059592