首页 > 编程语言 > 详细

SpringBoot整合Quartz使用模板

时间:2021-05-17 22:28:39      阅读:28      评论:0      收藏:0      [点我收藏+]

将定时调度参数写在数据库中,通过service调dao使用,listener监听定时调度事件

sql
CREATE TABLE `schedule_task` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(200) COLLATE utf8_bin NOT NULL COMMENT ‘定时任务名‘,
  `group_name` varchar(200) COLLATE utf8_bin NOT NULL COMMENT ‘定时任务组名‘,
  `cron` varchar(50) COLLATE utf8_bin NOT NULL COMMENT ‘定时任务cron表达式‘,
  `status` tinyint(4) NOT NULL DEFAULT ‘1‘ COMMENT ‘定时任务状态,0表示关闭,1表示开启, 默认值为1‘,
  `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8 COLLATE=utf8_bin
Dao
@Mapper
public interface ScheduleTaskDao {

  String TABLE = "schedule_task";

  String COLUMNS = "id, name, group_name, cron, status";

  @Select("SELECT " + COLUMNS + " FROM " + TABLE)
  List<ScheduleTask> getScheduleTaskList();
}
Service
@Service
public class ScheduleTaskService {

  @Autowired
  private ScheduleTaskDao scheduleTaskDao;

  public List<ScheduleTask> getScheduleTasks() {
    return scheduleTaskDao.getScheduleTaskList();
  }

}
@Slf4j
@Service("scheduleService")
public class ScheduleService {

  @Autowired
  private ScheduleTaskService scheduleTaskService;

  private Scheduler scheduler = null;

  public Scheduler getScheduler() {
    return scheduler;
  }

  public void setScheduler(Scheduler scheduler) {
    this.scheduler = scheduler;
  }

  public void processSchedule() {
    List<ScheduleTask> scheduleTaskList = scheduleTaskService.getScheduleTasks();

    for (ScheduleTask scheduleTask : scheduleTaskList) {
      if (!isValidScheduleTask(scheduleTask)) {
        log.error("scheduler task is defined incorrect. schedulerTask:{}", scheduleTask);
        continue;
      }

      if (SchedulerStatusEnum.SCHEDULER_START.getId() == scheduleTask.getStatus()) {
        this.startTask(scheduleTask);
      } else {
        this.stopTask(scheduleTask);
      }
    }
  }

  private void startTask(ScheduleTask scheduleTask) {
    try {
      String jobName = scheduleTask.getName();
      String jobGroupName = scheduleTask.getGroupName();
      String cron = scheduleTask.getCron();

      Class<? extends Job> clazz = (Class<? extends Job>) Class.forName(jobName);
      JobDetail jobDetail =
          JobBuilder.newJob(clazz).withIdentity(jobName, jobGroupName).storeDurably(true).build();

      CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(cron);

      Trigger trigger = TriggerBuilder.newTrigger().forJob(jobDetail).withIdentity(jobName,
          jobGroupName).withSchedule(scheduleBuilder).build();

      this.getScheduler().scheduleJob(jobDetail, trigger);
      log.info("start scheduler task success. schedulerTask:{}", scheduleTask);
    } catch (ClassNotFoundException e) {
      log.error("job not found. schedulerTask:{}, error:{}", scheduleTask, e);
    } catch (SchedulerException e) {
      log.error("start scheduler task fails. schedulerTask:{}, error:{}", scheduleTask, e);
    }
  }

  private void stopTask(ScheduleTask scheduleTask) {
    String jobName = scheduleTask.getName();
    String jobGroupName = scheduleTask.getGroupName();

    try {
      this.scheduler.unscheduleJob(TriggerKey.triggerKey(jobName, jobGroupName));
      this.scheduler.deleteJob(JobKey.jobKey(jobName, jobGroupName));
      log.info("stop scheduler task success. schedulerTask:{}", scheduleTask);
    } catch (SchedulerException e) {
      log.error("stop scheduler task fails. schedulerTask:{}", scheduleTask);
    }

  }

  private boolean isValidScheduleTask(ScheduleTask scheduleTask) {
    if (null == scheduleTask) {
      return false;
    }

    String name = scheduleTask.getName();
    String groupName = scheduleTask.getGroupName();
    String cron = scheduleTask.getCron();

    return StringUtils.isNotEmpty(name) && StringUtils.isNotEmpty(groupName) && StringUtils.isNotEmpty(cron);
  }

}
Listener
@WebListener
public class StartupListener implements ServletContextListener {

  private ScheduleService scheduleService;

  @Override
  public void contextInitialized(ServletContextEvent servletContextEvent) {
    ServletContext servletContext = servletContextEvent.getServletContext();
    ApplicationContext applicationContext =
        WebApplicationContextUtils.getWebApplicationContext(servletContext);
    this.scheduleService = Objects.requireNonNull(applicationContext).getBean(ScheduleService.class);
    Scheduler scheduler = applicationContext.getBean(Scheduler.class);
    this.scheduleService.setScheduler(scheduler);
    this.scheduleService.processSchedule();
  }

  @Override
  public void contextDestroyed(ServletContextEvent sce) {

  }
}
使用
INSERT INTO `sitebuilt`.`schedule_task` (`id`, `name`, `group_name`, `cron`)
 VALUES (‘9‘, ‘xxxxxx.TestTask‘, ‘xxxxx.TestTask‘, ‘0 30 18 * * ?‘);
@Slf4j
@DisallowConcurrentExecution
@Component
public class TestTask extends QuartzJobBean {
    @Autowired
    private MrrService mrrService;

    @Override
    protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
        mrrService.moneyInfo();
        log.info("count order information in 18:30 everyday");
    }

}

SpringBoot整合Quartz使用模板

原文:https://www.cnblogs.com/crisliu/p/14777269.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!