• Quartz高可用定时任务快速上手


    定时任务使用指南

    如果你想做定时任务,有高可用方面的需求,或者仅仅想入门快,上手简单,那么选用它准没错。

    定时任务模块是对Quartz框架进一步封装,使用更加简洁。

    1、引入依赖
    <dependency>
        <groupId>xin.altitude.cms</groupId>
        <artifactId>ucode-cms-quartz</artifactId>
        <version>1.5.4.1</version>
    </dependency>
    
    2、快速上手

    实现org.quartz.Job接口;使用注解CronExp添加任务的调度策略;使用注解Component将任务注入容器中。

    启动项目,定时任务便处于监听与运行中。

    @Component
    @DisallowConcurrentExecution
    @CronExp(cron = "0/5 * * * * ?")
    public class DemoJob implements Job {
        @Override
        public void execute(JobExecutionContext context) {
            System.out.println("任务1:" + LocalDateTime.now());
        }
    }
    

    3、手动触发定时任务

    定时任务除了以既有频率周期性运行外,还有通过接口手动被触发的能力。

    调用如下接口,可手动触发任务ID编号为jobId的任务。

    http://localhost:8080/cms-api/quartz/job/{jobId}
    

    如果有手动触发定时任务的需求,则需要任务ID唯一并已知,因此需要在编写定时任务时手动指定。

    @CronExp(id = 1, cron = "0/5 * * * * ?")
    

    通过注解CronExp的id属性可指定任务ID,不显示指定则使用随机ID,不满足已知的条件,因此无法手动触发。

    4、带参数任务

    尽管大多数任务不需要注入参数,但仍有少量的场景需要向定时任务注入参数。

    public void execute(JobExecutionContext context) {
        /* 如果在调用任务时传入了参数,则能够从Map中获取 */
        Map<String, Object> dataMap = context.getMergedJobDataMap();
        /* 比如从Map中获取一个键值对,一般来说参数均为基本数据类型 */
        Object key = dataMap.get("key");
        System.out.println("任务2:" + LocalDateTime.now() + ": " + key);
    }
    

    在编写定时任务时,可从JobExecutionContext对象中解析一个Map,从而完成参数的注入。

    http://localhost:8080/cms-api/quartz/job/1?key=a
    

    上述http调用的含义是手动触发任务ID为【1】的任务,并且向其传递参数为【key】值为【a】的参数。

    5、任务并发

    本框架不支持任务并发,换句话说并发对定时任务不利,因此需要手动禁止。

    需要注意的是Quartz的并发是指当任务执行耗时超过任务调度周期时,上一个任务未执行完,新任务是否执行。

    一般来说需要显示禁止并发,在任务类上添加注解DisallowConcurrentExecution即可禁止任务并发。

    6、持久化

    如果定时任务有高可用的需求,那么需要对任务进行持久化。定时任务数据持久化到数据库中后,支持应用程序多开。定时任务持久化多节点部署后,集群中单节点故障不影响定时任务的执行。

    定时任务持久化,仅需修改yml文件配置即可达到目标,无需修改代码。一般而言使用Mysql做持久化的容器。

    spring:
      quartz:
        properties:
          org.quartz.jobStore.isClustered: true
          org.quartz.jobStore.class: org.quartz.impl.jdbcjobstore.JobStoreTX
          org.quartz.jobStore.driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegate
          org.quartz.jobStore.dataSource: qzDS
          org.quartz.dataSource.qzDS.driver: com.mysql.cj.jdbc.Driver
          org.quartz.dataSource.qzDS.URL: jdbc:mysql://localhost:3306/quartz-demo
          org.quartz.dataSource.qzDS.user: root
          org.quartz.dataSource.qzDS.password: 123456
    

    除了修改主机、端口、数据库名、用户名、密码五个参数外,其余参数使用默认值即可。

    配置完数据库连接后,使用SQL脚本,注意初始化数据库

  • 相关阅读:
    GBASE 8s基本命令:onstat -k讲解
    查找算法【二叉查找树】 - 二叉查找树的删除
    【Linux】高级IO --- 多路转接,select,poll,epoll
    MFC工控项目实例一主菜单制作
    python 之输入、输出的简单介绍
    【mysql】遇到的问题及解决办法(在centos下)
    Linux之sqlserver客户端安装和使用简介
    设计模式课件
    解决 vue 项目开发越久 node_modules包越大的问题
    [附源码]计算机毕业设计基于Springboot在线教育系统
  • 原文地址:https://www.cnblogs.com/javazhishitupu/p/16089053.html