将定时调度参数写在数据库中,通过service调dao使用,listener监听定时调度事件
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
@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
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);
}
}
@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");
}
}
原文:https://www.cnblogs.com/crisliu/p/14777269.html