本文共 5622 字,大约阅读时间需要 18 分钟。
随着企业业务的不断扩展,自动化任务的需求日益增加。为了高效管理这些任务,我们选择了Quartz调度器,这是一个功能强大的开源调度器,能够满足我们的定时任务需求。本文将详细介绍如何使用Quartz实现自定义调度任务的创建、运行及管理。
我们选择了以下技术组合:
首先,我们需要创建一个调度任务。通过Quartz的API,我们可以定义任务的详细信息,包括执行计划和触发规则。
// 创建调度器Scheduler sched = new StdSchedulerFactory().getScheduler();sched.start();// 定义JobJobDetail job = newJob(HelloJob.class) .withIdentity("myJob", "group1") .build();// 定义触发器Trigger trigger = newTrigger() .withIdentity("myTrigger", "group1") .startNow() .withSchedule(new SimpleScheduleBuilder() .withIntervalInSeconds(40) .repeatForever()) .build();// 将Job和Trigger绑定sched.scheduleJob(job, trigger); 为了实现动态加载任务,我们创建了SchedulerBuilder类,用于动态管理调度任务。以下是SchedulerBuilder的主要功能:
public static class SchedulerBuilder { private static Scheduler schedulerFactory; static { schedulerFactory = new StdSchedulerFactory().getDefaultScheduler(); } public static void newCronScheduler(String name, String groupName, Class cls, String cron, String triggerGroupName, String data) throws SchedulerException { JobBuilder jobBuilder = newJob(cls) .withIdentity(name, groupName); // 添加数据参数 JobDetail job = addData(jobBuilder, data) .build(); // 创建触发器 Trigger trigger = TriggerBuilder.newTrigger() .withIdentity(name, triggerGroupName) .startNow() .withSchedule(CronScheduleBuilder.cronSchedule(cron)) .build(); schedulerFactory.scheduleJob(job, trigger); } // 其他方法:停止任务、启动任务、检查任务状态等} 我们定义了一个RunSystemSchedulers方法,用于启动系统 cron 任务。该任务负责根据配置文件动态加载所有自定义调度任务,并将它们绑定到Quartz调度器上。
public void RunSystemSchedulers() throws SchedulerException { synchronized (runSystemSchedulersLock) { List schedulers = schedulerMapper.selectSchedulers(); for (SysScheduler sysScheduler : schedulers) { String className = sysScheduler.getClassName(); Class cls = ClassUtils.getClassForName(className); SchedulerBuilder.newCronScheduler( sysScheduler.getJobName(), SchedulerConstant.CRON_JOB_DEFAULT_GROUP_NAME, cls, sysScheduler.getCron(), SchedulerConstant.CRON_TRIGGER_DEFAULT_GROUP_NAME, sysScheduler.getJobData() ); } SchedulerBuilder.startScheduler(); }} 我们还定义了一个RunSimpleSchedulers方法,用于启动系统 simple 任务。该任务负责执行立即运行的临时任务,并记录每次运行的详细信息。
public Integer RunSimpleSchedulers() throws SchedulerException { synchronized (runSimpleSchedulersLock) { List schedulers = schedulerSimpleMapper.selectSchedulerSimplePage(); for (SchedulerSimplePageViewPo sysScheduler : schedulers) { try { String className = sysScheduler.getClassName(); Class cls = ClassUtils.getClassForName(className); SchedulerBuilder.newSimpleScheduler( sysScheduler.getJobName(), SchedulerConstant.SIMPLE_JOB_DEFAULT_GROUP_NAME, cls, SchedulerConstant.SIMPLE_TRIGGER_DEFAULT_GROUP_NAME, sysScheduler.getJobData() ); updateSchedulerSimpleStatus(sysScheduler.getSchedulerExecuteSimpleId(), SchedulerSimpleStatusEnum.SUCCESS); } catch (SchedulerException e) { updateSchedulerSimpleStatus(sysScheduler.getSchedulerExecuteSimpleId(), SchedulerSimpleStatusEnum.ERROR); } } SchedulerBuilder.startScheduler(); return schedulers.size(); }} 为了记录每个任务的执行时间,我们实现了一个抽象类AbstractDefaultJob,该类继承自Quartz的Job接口。具体实现如下:
public abstract class AbstractDefaultJob implements Job { private static final Logger logger = LoggerFactory.getLogger(AbstractDefaultJob.class); public void execute(JobExecutionContext context) throws JobExecutionException { long start = System.currentTimeMillis(); String name = ""; SchedulerSimpleJobTypeEnum schedulerSimpleJobTypeEnum = SchedulerSimpleJobTypeEnum.CRON; try { JobKey key = context.getTrigger().getJobKey(); name = key.getName(); if (SchedulerConstant.SIMPLE_JOB_DEFAULT_GROUP_NAME.equals(key.getGroup())) { schedulerSimpleJobTypeEnum = SchedulerSimpleJobTypeEnum.SIMPLE; } JobDataMap dataMap = context.getMergedJobDataMap(); SchedulerExecuteResult result = run(dataMap); handleExecute(name, start, true, schedulerSimpleJobTypeEnum, result.getMessage()); } catch (Exception e) { logger.error(e.getMessage()); handleExecute(name, start, false, schedulerSimpleJobTypeEnum, ""); } } public void handleExecute(String schedulerName, long start, boolean success, SchedulerSimpleJobTypeEnum jobTypeEnum, String remark) { long end = System.currentTimeMillis(); long executeInterval = end - start; schedulerExecuteService.insertSchedulerExecute(schedulerName, start, end, executeInterval, success, jobTypeEnum, remark); } public abstract SchedulerExecuteResult run(JobDataMap dataMap) throws SchedulerException; public T getBean(Class cls) { String name = cls.getSimpleName(); name = VariableNameConvert.firstLetterLower(name); return SpringContext.getBean(name); }} 通过Quartz调度器,我们成功实现了自定义调度任务的创建、运行及管理。系统 cron 任务负责动态加载和管理定时任务,系统 simple 任务负责执行临时任务。结合前端页面和后台管理,我们打造了一个高效、灵活的自动化任务管理系统。
转载地址:http://imefk.baihongyu.com/