Java最新一文搞懂java中的定时任务框架-分布式(xxl-job),Redis如何实现高可扩展

最后

作为过来人,小编是整理了很多进阶架构视频资料、面试文档以及PDF的学习资料,针对上面一套系统大纲小编也有对应的相关进阶架构视频资料


本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

  • mvn clean package -Dmaven.test.skip=true

3.3. 访问调度中心

4. 配置部署执行器项目


  • “执行器”项目:xxl-job-executor-sample-springboot (提供多种版本执行器供选择,现以 springboot 版本为例,可直接使用,也可以参考其并将现有项目改造成执行器)

  • 作用:负责接收“调度中心”的调度并执行;可直接部署执行器,也可以将执行器集成到现有业务项目中。

  • 原理:

  • 执行器实际上是一个内嵌的Server,默认端口9999(配置项:xxl.job.executor.port)。

  • 在项目启动时,执行器会通过“@JobHandler”识别Spring容器中“Bean模式任务”,以注解的value属性为key管理起来。

  • “执行器”接收到“调度中心”的调度请求时,如果任务类型为“Bean模式”,将会匹配Spring容器中的“Bean模式任务”,然后调用其execute方法,执行任务逻辑。如果任务类型为“GLUE模式”,将会加载GLue代码,实例化Java对象,注入依赖的Spring服务(注意:Glue代码中注入的Spring服务,必须存在与该“执行器”项目的Spring容器中),然后调用execute方法,执行任务逻辑。

4.1 maven依赖

  • 执行器项目需要引入 “xxl-job-core” 的maven依赖,版本要和注册中心版本一致

com.xuxueli

xxl-job-core

${project.parent.version}

复制代码

4.2 修改配置文件:

  • xxl-job-executor-sample-springboot/src/main/resources/application.properties

  • 修改调度中心部署跟地址

  • 需修改或自定义

  • xxl.job.admin.addresses 地址

  • xxl.job.executor.appname 自定义名称,后台配置必须对应

  • xxl.job.executor.ip 当前电脑Ip,或部署项目的电脑Ip

  • xxl.job.executor.port 端口

  • xxl.job.accessToken 自定义的token,要和admin模块配置的一致

调度中心部署跟地址 [选填]:如调度中心集群部署存在多个地址则用逗号分隔。执行器将会使用该地址进行"执行器心跳注册"和"任务结果回调";为空则关闭自动注册;

xxl.job.admin.addresses=http://127.0.0.1:8080/xxl-job-admin

xxl-job, access token 自定义的token,要和admin模块配置的一致

xxl.job.accessToken=ljwtoken

xxl-job executor appname 自定义名称,后台配置必须对应

xxl.job.executor.appname=xxl-job-executor-sample

xxl-job executor registry-address: default use address to registry , otherwise use ip:port if address is null

xxl.job.executor.address=

xxl-job executor server-info

xxl.job.executor.ip=127.0.0.1

xxl.job.executor.port=9999

复制代码

4.3 执行器组件配置 要配置执行器组件,配置文件参考地址:/xxl-job/xxl-job-executor-samples/xxl-job-executor-sample-springboot/src/main/java/com/xxl/job/executor/core/config/XxlJobConfig.java

@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;

}

复制代码

4.4 部署执行器项目

  • 如果已经正确进行上述配置,将执行器项目编译打部署,我们使用springboot项目,打包运行xxl-job-executor-sample-springboot即可

  • mvn clean package -Dmaven.test.skip=true

  • 执行器项目集群部署参考

5. GLUE模式(Java)开发一个任务


  • GLUE模式(Java)原理:任务以源码方式维护在调度中心;该模式的任务实际上是一段继承自IJobHandler的Java类代码并 “groovy” 源码方式维护,它在执行器项目中运行,可使用@Resource/@Autowire注入执行器里中的其他服务(请确保Glue代码中的服务和类引用在“执行器”项目中存在),然后调用该对象的execute方法,执行任务逻辑。

  • GLUE模式(Java)就是在界面编写代码即可,不用在执行器项目中编写代码

5.1 新建任务

  • 登录调度中心,点击下图所示“新增”按钮,新建示例任务。然后,参考下面截图中任务的参数配置,点击保存。

image.png

5.2 “GLUE模式(Java)” 任务开发

  • 请点击任务右侧 “GLUE IDE” 按钮,进入 “GLUE编辑器开发界面” ,见下图。“GLUE模式(Java)” 运行模式的任务默认已经初始化了示例任务代码,即打印Hello World。

image.png

5.3 触发执行

  • 请点击任务右侧 “执行一次” 按钮,可手动触发一次任务执行(通常情况下,通过配置Cron表达式进行任务调度触发)。

5.4 查看日志:

  • 请点击任务右侧 “调度日志” 按钮,可前往任务日志界面查看任务日志。

  • 在任务日志界面中,可查看该任务的历史调度记录以及每一次调度的任务调度信息、执行参数和执行信息。运行中的任务点击右侧的“执行日志”按钮,可进入日志控制台查看实时执行日志。

6. BEAN模式开发一个任务


  • BEAN模式原理:任务以JobHandler方式维护在执行器端;需要结合 “JobHandler” ,任务类需要加“@JobHandler(value=“名称”)”注解,因为“执行器”会根据该注解识别Spring容器中的任务。任务类需要继承统一接口“IJobHandler”,任务逻辑在execute方法中开发,因为“执行器”在接收到调度中心的调度请求时,将会调用“IJobHandler”的execute方法,执行任务逻辑。

6.1 类形式

6.1.1 优缺点

  • Bean模式任务,支持基于类的开发方式,每个任务对应一个Java类。

  • 优点:

  • 不限制项目环境,兼容性好。即使是无框架项目,如main方法直接启动的项目也可以提供支持

  • 缺点:

  • 每个任务需要占用一个Java类,造成类的浪费;

  • 不支持自动扫描任务并注入到执行器容器,需要手动注入。

6.1.2 执行器项目中,开发Job类

  • 1、开发一个继承自"com.xxl.job.core.handler.IJobHandler"的JobHandler类,实现其中任务方法。

  • 2、手动通过如下方式注入到执行器容器。

  • :XxlJobExecutor.registJobHandler(“demoJobHandler”, new DemoJobHandler());

注:版本v2.2.0 移除旧类注解@JobHandler,推荐使用基于方法注解@XxlJob的方式进行任务开发;(如需保留类注解JobHandler使用方式,可以参考旧版逻辑定制开发);

public class MyJobHandler extends IJobHandler {

@Override

public void execute() throws Exception {

XxlJobHelper.log(“11MyJobHandler===”);

System.out.println(“22MyJobHandler===”);

}

}

复制代码

注入myJobHandler:

@SpringBootApplication

public class XxlJobExecutorApplication {

public static void main(String[] args) {

SpringApplication.run(XxlJobExecutorApplication.class, args);

XxlJobExecutor.registJobHandler(“myJobHandler”, new MyJobHandler());

}

}

复制代码

6.1.3 调度中心,新建调度任务

  • JobHandler填写@JobHandler的value值

image.png

  • 新建后可以测试运行一次查看日志是否成功

6.2 方法形式

6.2.1 优缺点

  • 基于方法开发的任务,底层会生成JobHandler代理,和基于类的方式一样,任务也会以JobHandler的形式存在于执行器任务容器中。

  • 优点:

  • 每个任务只需要开发一个方法,并添加@XxlJob注解即可,更加方便、快速。

  • 支持自动扫描任务并注入到执行器容器。

  • 缺点:要求Spring容器环境

6.2.2 执行器项目中,开发Job方法

    1. 任务开发:在Spring Bean实例中,开发Job方法
    1. 注解配置:为Job方法添加注解 “@XxlJob(value=“自定义jobhandler名称”, init = “JobHandler初始化方法”, destroy = “JobHandler销毁方法”)”,注解value值对应的是调度中心新建任务的JobHandler属性的值。
    1. 执行日志:需要通过 “XxlJobHelper.log” 打印执行日志
    1. 任务结果:默认任务结果为 “成功” 状态,不需要主动设置;如有诉求,比如设置任务结果为失败,可以通过 “XxlJobHelper.handleFail/handleSuccess” 自主设置任务结果

@Configuration

public class MyXxlJobConfig {

@XxlJob(“myXxlJobConfig”)

public boolean demoJobHandler() throws Exception {

XxlJobHelper.log(“myXxlJobConfig====”);

System.out.println(“myXxlJobConfig====”);

//ReturnT无作用

//return new ReturnT(200, “hahahahah”);

return XxlJobHelper.handleSuccess(“myXxlJobConfig hello world”);

}

@XxlJob(“myfaile”)

public boolean myfaile() throws Exception {

XxlJobHelper.log(“myfaile====”);

System.out.println(“myfaile====”);

return XxlJobHelper.handleFail(“myfaile hello world”);

}

/**

  • 5、生命周期任务示例:任务初始化与销毁时,支持自定义相关逻辑;init只在第一次调度时执行一次。destroy每次调度都执行

*/

@XxlJob(value = “demoJobHandler2”, init = “init”, destroy = “destroy”)

public void demoJobHandler2() throws Exception {

System.out.println(“demoJobHandler2====”);

XxlJobHelper.log(“XXL-JOB, Hello World.”);

}

public void init() {

System.out.println(“init====”);

logger.info(“init”);

}

public void destroy() {

System.out.println(“destory====”);

logger.info(“destory”);

}

总结

面试前的“练手”还是很重要的,所以开始面试之前一定要准备好啊,不然也是耽搁面试官和自己的时间。

我自己是刷了不少面试题的,所以在面试过程中才能够做到心中有数,基本上会清楚面试过程中会问到哪些知识点,高频题又有哪些,所以刷题是面试前期准备过程中非常重要的一点。

面试题及解析总结

三年Java开发,刚从美团、京东、阿里面试归来,分享个人面经

大厂面试场景

三年Java开发,刚从美团、京东、阿里面试归来,分享个人面经

知识点总结

三年Java开发,刚从美团、京东、阿里面试归来,分享个人面经

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

一定要准备好啊,不然也是耽搁面试官和自己的时间。

我自己是刷了不少面试题的,所以在面试过程中才能够做到心中有数,基本上会清楚面试过程中会问到哪些知识点,高频题又有哪些,所以刷题是面试前期准备过程中非常重要的一点。

面试题及解析总结

[外链图片转存中…(img-qQYvDnH6-1715421433254)]

大厂面试场景

[外链图片转存中…(img-FOevuCSW-1715421433254)]

知识点总结

[外链图片转存中…(img-MpkOKqMj-1715421433255)]

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

  • 29
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值