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);
   }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章