博客
关于我
自定义任务调度实现-org.quartz-scheduler
阅读量:798 次
发布时间:2023-04-02

本文共 5622 字,大约阅读时间需要 18 分钟。

使用Quartz调度器实现自定义调度任务

背景

随着企业业务的不断扩展,自动化任务的需求日益增加。为了高效管理这些任务,我们选择了Quartz调度器,这是一个功能强大的开源调度器,能够满足我们的定时任务需求。本文将详细介绍如何使用Quartz实现自定义调度任务的创建、运行及管理。


技术选型

我们选择了以下技术组合:

  • SpringBoot:用于快速开发后台管理系统。
  • Mybatis:用于数据库数据交互。
  • Quartz调度器:用于定义和管理定时任务。

实现步骤

1. 创建调度任务

首先,我们需要创建一个调度任务。通过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);
2. 动态加载任务

为了实现动态加载任务,我们创建了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);    }    // 其他方法:停止任务、启动任务、检查任务状态等}
3. 系统cron任务

我们定义了一个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(); }}
4. 系统simple任务

我们还定义了一个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(); }}
5. 记录执行时间

为了记录每个任务的执行时间,我们实现了一个抽象类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/

你可能感兴趣的文章
OSPF技术连载13:OSPF Hello 间隔和 Dead 间隔
查看>>
OSPF技术连载14:OSPF路由器唯一标识符——Router ID
查看>>
OSPF技术连载15:OSPF 数据包的类型、格式和邻居发现的过程
查看>>
OSPF技术连载16:DR和BDR选举机制,一篇文章搞定!
查看>>
OSPF技术连载17:优化OSPF网络性能利器——被动接口!
查看>>
OSPF技术连载18:OSPF网络类型:非广播、广播、点对多点、点对多点非广播、点对点
查看>>
OSPF技术连载19:深入解析OSPF特殊区域
查看>>
SQL Server 复制 订阅与发布
查看>>
OSPF技术连载20:OSPF 十大LSA类型,太详细了!
查看>>
OSPF技术连载21:OSPF虚链路,现代网络逻辑连接的利器!
查看>>
OSPF技术连载22:OSPF 路径选择 O > O IA > N1 > E1 > N2 > E2
查看>>
OSPF技术连载2:OSPF工作原理、建立邻接关系、路由计算
查看>>
OSPF技术连载5:OSPF 基本配置,含思科、华为、Junifer三厂商配置
查看>>
OSPF技术连载6:OSPF 多区域,近7000字,非常详细!
查看>>
OSPF技术连载7:什么是OSPF带宽?OSPF带宽参考值多少?
查看>>
OSPF技术连载8:OSPF认证:明文认证、MD5认证和SHA-HMAC验证
查看>>
OSPF故障排除技巧
查看>>
spring配置文件中<context:property-placeholder />的使用
查看>>
OSPF有哪些优势?解决了RIP的什么问题?
查看>>
OSPF理论
查看>>