All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.lframework.starter.web.components.qrtz.QrtzHandler Maven / Gradle / Ivy

package com.lframework.starter.web.components.qrtz;

import com.lframework.common.exceptions.impl.DefaultSysException;
import com.lframework.common.utils.CollectionUtil;
import com.lframework.common.utils.StringUtil;
import com.lframework.starter.web.utils.ApplicationUtil;
import java.util.Map;
import lombok.extern.slf4j.Slf4j;
import org.quartz.CronScheduleBuilder;
import org.quartz.CronTrigger;
import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.JobKey;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.Trigger;
import org.quartz.TriggerBuilder;
import org.quartz.TriggerKey;
import org.springframework.scheduling.quartz.SchedulerFactoryBean;

@Slf4j
public class QrtzHandler {

  private static final SchedulerFactoryBean SCHEDULER_FACTORY = ApplicationUtil.getBean(
      SchedulerFactoryBean.class);

  public static void addJob(Class jobClass, String cron,
      Map jobDatas) {

    addJob(null, null, jobClass, null, null, cron, jobDatas);
  }

  public static void addJob(Class jobClass, String cron) {

    addJob(null, null, jobClass, null, null, cron, null);
  }

  public static void addJob(String jobName, String jobGroupName, Class jobClass,
      String triggerName, String triggerGroupName, String cron) {

    addJob(jobName, jobGroupName, jobClass, triggerName, triggerGroupName, cron, null);
  }

  /**
   * 添加任务
   *
   * @param jobName          任务名
   * @param jobGroupName     任务组名
   * @param jobClass         任务类Class
   * @param triggerName      触发器名
   * @param triggerGroupName 触发器组名
   * @param cron             cron表达式
   * @param jobDatas         附加数据
   */
  public static void addJob(String jobName, String jobGroupName, Class jobClass,
      String triggerName, String triggerGroupName, String cron, Map jobDatas) {

    try {
      Scheduler sched = SCHEDULER_FACTORY.getScheduler();
      JobBuilder jobBuilder = JobBuilder.newJob(jobClass);
      if (!StringUtil.isBlank(jobName)) {
        jobBuilder.withIdentity(jobName, jobGroupName);
      }
      if (!CollectionUtil.isEmpty(jobDatas)) {
        jobDatas.forEach(jobBuilder::usingJobData);
      }

      JobDetail jobDetail = jobBuilder.build();

      TriggerBuilder triggerBuilder = TriggerBuilder.newTrigger();
      if (!StringUtil.isBlank(triggerName)) {
        triggerBuilder.withIdentity(triggerName, triggerGroupName);
      }

      triggerBuilder.startNow();
      triggerBuilder.withSchedule(CronScheduleBuilder.cronSchedule(cron));
      CronTrigger trigger = (CronTrigger) triggerBuilder.build();
      sched.scheduleJob(jobDetail, trigger);

      if (!sched.isShutdown()) {
        sched.start();
      }
    } catch (Exception e) {
      log.error(e.getMessage(), e);
      throw new DefaultSysException(e.getMessage());
    }
  }

  /**
   * 查询触发器
   *
   * @param triggerName      触发器名称
   * @param triggerGroupName 触发器组名称
   * @return
   */
  public static CronTrigger getTrigger(String triggerName, String triggerGroupName) {

    try {
      Scheduler sched = SCHEDULER_FACTORY.getScheduler();
      TriggerKey triggerKey = TriggerKey.triggerKey(triggerName, triggerGroupName);
      CronTrigger trigger = (CronTrigger) sched.getTrigger(triggerKey);

      return trigger;
    } catch (Exception e) {
      log.error(e.getMessage(), e);
      throw new DefaultSysException(e.getMessage());
    }
  }

  /**
   * 查询任务
   *
   * @param jobName
   * @param jobGroupName
   * @return
   */
  public static JobDetail getJob(String jobName, String jobGroupName) {

    try {
      Scheduler sched = SCHEDULER_FACTORY.getScheduler();
      JobDetail jobDetail = sched.getJobDetail(JobKey.jobKey(jobName, jobGroupName));
      return jobDetail;
    } catch (Exception e) {
      log.error(e.getMessage(), e);
      throw new DefaultSysException(e.getMessage());
    }
  }

  /**
   * 修改任务Cron
   *
   * @param triggerName      触发器名称
   * @param triggerGroupName 触发器组名称
   * @param cron             cron表达式
   */
  public static void updateJobCron(String triggerName, String triggerGroupName, String cron) {

    try {
      Scheduler sched = SCHEDULER_FACTORY.getScheduler();
      CronTrigger trigger = getTrigger(triggerName, triggerGroupName);
      if (trigger == null) {
        return;
      }

      String oriCron = trigger.getCronExpression();
      if (!oriCron.equalsIgnoreCase(cron)) {
        TriggerBuilder triggerBuilder = TriggerBuilder.newTrigger();
        triggerBuilder.withIdentity(triggerName, triggerGroupName);
        triggerBuilder.startNow();
        triggerBuilder.withSchedule(CronScheduleBuilder.cronSchedule(cron));
        trigger = (CronTrigger) triggerBuilder.build();
        sched.rescheduleJob(TriggerKey.triggerKey(triggerName, triggerGroupName), trigger);
      }
    } catch (Exception e) {
      log.error(e.getMessage(), e);
      throw new DefaultSysException(e.getMessage());
    }
  }

  /**
   * 删除任务
   *
   * @param jobName          任务名称
   * @param jobGroupName     任务组名称
   * @param triggerName      触发器名称
   * @param triggerGroupName 触发器组名称
   */
  public static void deleteJob(String jobName, String jobGroupName, String triggerName,
      String triggerGroupName) {

    try {
      Scheduler sched = SCHEDULER_FACTORY.getScheduler();

      TriggerKey triggerKey = TriggerKey.triggerKey(triggerName, triggerGroupName);

      sched.pauseTrigger(triggerKey);
      sched.unscheduleJob(triggerKey);
      sched.deleteJob(JobKey.jobKey(jobName, jobGroupName));
    } catch (Exception e) {
      log.error(e.getMessage(), e);
      throw new DefaultSysException(e.getMessage());
    }
  }

  /**
   * 启动所有任务
   */
  public static void startJobs() {

    try {
      Scheduler sched = SCHEDULER_FACTORY.getScheduler();
      sched.start();
    } catch (Exception e) {
      log.error(e.getMessage(), e);
      throw new DefaultSysException(e.getMessage());
    }
  }

  /**
   * 关闭所有任务
   */
  public static void shutdownJobs() {

    try {
      Scheduler sched = SCHEDULER_FACTORY.getScheduler();
      if (!sched.isShutdown()) {
        sched.shutdown();
      }
    } catch (Exception e) {
      log.error(e.getMessage(), e);
      throw new DefaultSysException(e.getMessage());
    }
  }

  /**
   * 安全关闭
   *
   * @throws SchedulerException
   */
  public static void safeShutdown() throws SchedulerException {

    int executingJobSize = SCHEDULER_FACTORY.getScheduler().getCurrentlyExecutingJobs().size();
    log.info("当前运行任务个数:{},等待完成后关闭", executingJobSize);
    SCHEDULER_FACTORY.getScheduler().shutdown(true);
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy