xxl-job入门

xxl-job入门

引入

在平时的事务场景中,常常有一些场景需求运用守时使命,比方:

  • 时刻驱动的场景:体系需求守时每天0点进行数据备份,体系在某个时刻点发送优惠券,发送短信等等;
  • 批量处理数据:批量统计上个月的账单,统计上个月出售数据等等;
  • 固定频率的场景:每隔5分钟需求履行一次。

这些场景问题都能够经过使命调度来处理,使命调度指的是体系在约定的指守时刻主动履行指定使命的进程,简略来说,能够理解为规定在何时以何种方法主动去履行使命

在单体体系完成使命调度的方法:

  • 多线程
  • Timer
  • Spring Tasks:@EnableScheduling + @Scheduled

有了上述几种完成使命调度的方法,为什么还需求分布式完成使命调度方法呢?

  • 高可用:单机的守时使命只能在一台机器上运转,如果程序或者体系出现异常就会导致功能不可用;
  • 防止重复履行:分布式布置多台服务,每台服务有守时使命,如果不进行合理的控制,在同一时刻,只要一个守时使命发动履行,这时,守时履行的成果就可能存在错误和紊乱;
  • 单机处理极限:单机处理能力有限

分布式完成使命调度的方法:

  • xxl-job
  • Quartz
  • elastic-job

xxl-job

xxl-job完成守时使命能够理解为是经过使命调度渠道履行器相互通信,然后到达完成守时使命的意图。

xxl-job中的两个核心概念:

  • 调度渠道:担任办理调度信息,按照调度的装备宣布调度恳求(xxl-job供给可视化界面,程序员直接进入调度渠道按照要求装备即可,无需编写代码
  • 履行器:担任接纳调度恳求,履行调度使命的事务逻辑(由程序员编写代码完成详细履行的逻辑)。履行器发动后要注册到调度中心,接纳调度中心宣布的恳求

xxl-job入门

xxl-job原理图

xxl-job入门

xxl-job实战

下载

官网地址:www.xuxueli.com/xxl-job/

到官网下载zip

xxl-job入门

装备布置调度中心

  1. 解压下载好的文件,打开/doc/db/tables_xxl_job.sql

xxl-job入门

xxl-job入门

  1. 复制sql,到数据库中履行(以dbeaver为例)

xxl-job入门

xxl-job入门

  1. 将指定文件复制到sql编辑器中,依条履行,履行成功后,会生成一个xxl_job数据库

xxl-job入门

  1. 用idea打开下载好的项目xxl-job-master,修正装备文件数据库相关信息,按照自己数据库的地址,账号和密码装备,装备后发动

xxl-job入门

  1. 成功发动后,拜访调度中心,拜访地址为:http://localhost:8080/xxl-job-admin,默许登录账号 “admin/123456”

xxl-job入门

  1. 登录成功后,进入使命调度中心,主界面如图所示

xxl-job入门

装备布置履行器

  1. 创立Springboot项目xxljobDemo,pom文件中增加相关依赖
   <dependency>
      <groupId>com.xuxueli</groupId>
      <artifactId>xxl-job-core</artifactId>
      <version>2.3.0</version>
   </dependency>
   <dependency>
      <groupId>org.projectlombok</groupId>
      <artifactId>lombok</artifactId>
   </dependency>
  1. 修正装备文件application.properties,坚持与xxl-job-master中的装备一致,留意需求装备下服务器端口,避免冲突

xxl-job入门

server.port = 8088
### 调度中心布置根地址 [选填]:如调度中心集群布置存在多个地址则用逗号分隔。履行器将会运用该地址进行"履行器心跳注册"和"使命成果回调";为空则封闭主动注册;
xxl.job.admin.addresses=http://127.0.0.1:8080/xxl-job-admin
### 履行器通讯TOKEN [选填]:非空时启用;
xxl.job.accessToken=default_token
### 履行器AppName [选填]:履行器心跳注册分组依据;为空则封闭主动注册
xxl.job.executor.appname=xxl-job-executor-sample
### 履行器注册 [选填]:优先运用该装备作为注册地址,为空时运用内嵌服务 ”IP:PORT“ 作为注册地址。然后更灵敏的支持容器类型履行器动态IP和动态映射端口问题。
xxl.job.executor.address=
### 履行器IP [选填]:默以为空表示主动获取IP,多网卡时可手动设置指定IP,该IP不会绑定Host仅作为通讯实用;地址信息用于 "履行器注册" 和 "调度中心恳求并触发使命";
xxl.job.executor.ip=
### 履行器端口号 [选填]:小于等于0则主动获取;默许端口为9999,单机布置多个履行器时,留意要装备不同履行器端口;
xxl.job.executor.port=9999
### 履行器运转日志文件存储磁盘途径 [选填] :需求对该途径具有读写权限;为空则运用默许途径;
xxl.job.executor.logpath=/data/applogs/xxl-job/jobhandler
### 履行器日志文件保存天数 [选填] : 过期日志主动整理, 限制值大于等于3时收效; 否则, 如-1, 封闭主动整理功能;
xxl.job.executor.logretentiondays=30
  1. 增加xxl-job装备类

xxl-job入门

@Configuration
public class XxlJobConfig {
    private Logger logger = LoggerFactory.getLogger(XxlJobConfig.class);
    @Value("${xxl.job.admin.addresses}")
    private String adminAddresses;
    @Value("${xxl.job.accessToken}")
    private String accessToken;
    @Value("${xxl.job.executor.appname}")
    private String appname;
    @Value("${xxl.job.executor.address}")
    private String address;
    @Value("${xxl.job.executor.ip}")
    private String ip;
    @Value("${xxl.job.executor.port}")
    private int port;
    @Value("${xxl.job.executor.logpath}")
    private String logPath;
    @Value("${xxl.job.executor.logretentiondays}")
    private int logRetentionDays;
    @Bean
    public XxlJobSpringExecutor xxlJobExecutor() {
        logger.info(">>>>>>>>>>> xxl-job config init.");
        XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor();
        xxlJobSpringExecutor.setAdminAddresses(adminAddresses);
        xxlJobSpringExecutor.setAppname(appname);
        xxlJobSpringExecutor.setAddress(address);
        xxlJobSpringExecutor.setIp(ip);
        xxlJobSpringExecutor.setPort(port);
        xxlJobSpringExecutor.setAccessToken(accessToken);
        xxlJobSpringExecutor.setLogPath(logPath);
        xxlJobSpringExecutor.setLogRetentionDays(logRetentionDays);
        return xxlJobSpringExecutor;
    }
}

编写使命

  1. 新建job包,包下界说SimpleJob类,类中界说详细使命

xxl-job入门

@Component
public class SimpleJob {
    @XxlJob("demoJobHander")
    public void demoJobHandler() throws Exception{
        System.out.println("履行守时使命,履行时刻:" + new Date());
    }
}
  1. 发动项目xxljobDemo

xxl-job入门

  1. 发动成功后,进入使命调度中心设置履行器相关信息

xxl-job入门

xxl-job入门

  1. 装备完成后,发动使命,使命状况由stop–>running状况

xxl-job入门

经过控制台能够看到,我们规定的使命隔3s履行一次

xxl-job入门

  1. 使命中止后,状况由running–>stop

xxl-job入门

  1. 能够经过查看日志按钮查看调度日志

xxl-job入门

xxl-job入门

这样就完成了一个简略的守时使命!

参考资料

www.xuxueli.com/xxl-job/

developer.aliyun.com/article/775…

www.bilibili.com/video/BV182…

zhuanlan.zhihu.com/p/625060354