javaWeb学习Java服务端面试Spring cloud

分布式任务调度平台XXL-JOB搭建教程

2019-05-28  本文已影响24人  AKyS佐毅

一、使用XXL-JOB的原因

1、 Quartz的不足

Quartz作为开源任务调度中的佼佼者,是任务调度的首选。但是在集群环境中,Quartz采用API的方式对任务进行管理,这样存在以下问题:

XXL-JOB弥补了Quartz的上述不足之处。

2. RemoteHttpJobBean

常规的Quartz的开发,任务逻辑一般维护在QuartzJobBean中,耦合很严重。

XXL-JOB中“调度模块”和“任务模块”完全解耦,调度模块中的所有调度任务使用同一个QuartzJobBean,即RemoteHttpJobBean。不同的调度任务将各自的调度参数维护在各自的扩展表数据中,当触发RemoteHttpJobBean执行时,将会解析不同的调度参数发起远程调用,调用各自的远程执行器服务。

这种调用模型类似RPC调用,RemoteHttpJobBean提供调用代理的功能,而执行器提供远程服务的功能。

3. 架构设计

XXL-JOB将调度行为抽象形成“调度中心”公共平台,而平台自身并不承担业务逻辑,“调度中心”只负责发起调度请求。

将任务抽象成分散的JobHandler,交由“执行器”统一管理,“执行器”负责接收调度请求并执行对应的JobHandler中的业务逻辑。

因此,“调度”和“任务”两部分可以解耦成调度模块和执行模块,提高业务系统的整体稳定性和扩展性:

XXL-JOB的系统架构,如下图所示:

三、建立SpringBoot示例工程

通过STS建立SpringBoot的示例工程,名称为xxl-job-demo。本文采用的配置如下:

这个示例工程将作为“执行器”,接收“调度中心”的调度请求,然后将Redis中的消息输出至任务日志。具体的创建步骤,本文不再赘述。

这个示例工程会用到Jedis客户端,其配置文件会交给Disconf托管,请参考《基于注解的分布式配置文件和配置项》,本文不再赘述。

四、整合XXL-JOB执行器

1. Maven依赖

打开pom.xml文件,添加XXL-JOB执行器的依赖关系,如下所示:

<dependency>
   <groupId>com.xuxueli</groupId>
   <artifactId>xxl-job-core</artifactId>
   <version>1.9.1</version>
</dependency>

2. 执行器配置文件

打开application.properties文件,添加执行器配置。application.properties文件的全部内容,如下所示:

image.png

XXL-JOB执行器的相关配置项的意义,如下所示:

注意,XXL-JOB执行器的配置文件也可以交给Disconf进行托管。

3. 执行器配置类

还需要新建一个执行器配置类,用来读取执行器的配置信息。新建一个名为com.example.demo.config的包,然后在这个包中新建一个名为XxlJobConfig的类,主要内容如下所示:

XxlJobConfig配置类有两点需要注意:

五、执行器

在浏览器中访问http://10.15.1.21:8081,登录XXL-JOB调度中心,默认的用户名/密码是admin/123456。

点击进入“执行器管理”页面,然后点击“新增执行器”按钮,弹出新增执行器窗口,如下图所示:

新增执行器时,需要填写的信息,如下所示:

注意,AppName的取值应该和示例工程的application.properties文件中的xxl.job.executor.appname字段的取值相同,注册方式应该选择自动注册。新增完成之后,就可以在执行器列表中看到新建的执行器,如下图所示:

注意,执行器列表的“OnLine 机器地址”字段会在执行器启动时,显示执行器的IP地址和端口号。

六、任务

1. 任务调度属性

在XXL-JOB调度中心,点击进入“任务管理”页面,然后点击“新增任务”按钮,弹出新增任务窗口,如下图所示:

新增任务时,需要填写的信息,如下所示:

注意,编辑任务时也会弹出类似的窗口,其中的输入项请参考新增任务窗口。

接下来,本文将详述BEAN模式任务和GLUE(Java)模式任务,以及分片广播路由策略,这些是XXL-JOB最常用的功能。

2. BEAN模式

任务逻辑以JobHandler的形式存在于“执行器”所在项目中,开发流程如下:

Step-1 开发JobHandler代码

在示例工程中,新建com.example.demo.jobhandler包,用来存储任务的业务逻辑代码。在这个包中新建DemoJobHandler任务类,关键代码如下所示:

上述代码有三点需要注意:

Step-2 新建调度任务

参考上文“任务调度属性”对新建的任务进行参数配置,运行模式选择“BEAN模式”,JobHandler属性填写任务注解@JobHandler中定义的值,如下图所示:

调度中心会每隔15分钟调度一次demoJobHandler任务。

3. GLUE(Java)模式

任务以源码方式维护在调度中心,支持通过Web IDE在线更新,实时编译和生效,因此不需要指定JobHandler。开发流程如下:

Step-1 新建调度任务

参考上文“任务调度属性”对新建的任务进行参数配置,运行模式选择“GLUE模式(Java)”,如下图所示:

调度中心会每隔15分钟调度一次这个任务。

Step-2 开发任务代码

在任务列表中选中指定的GLUE(Java)任务,点击该任务右侧的“GLUE”按钮,将会前往GLUE任务的Web IDE界面,在该界面支持对任务代码进行开发(也可以在IDE中开发完成后,复制粘贴到编辑中)。

版本回溯功能:在GLUE任务的Web IDE界面,选择右上角下拉框“版本回溯”,会列出该GLUE任务的更新历史(支持30个版本的版本回溯),选择相应版本即可显示该版本代码,保存后GLUE代码即回退到对应的历史版本。GLUE任务代码和Web IDE界面,如下图所示:

4. 分片广播任务

执行器集群部署时,任务路由策略选择“分片广播”的情况下,一次任务调度将会广播触发对应集群中所有执行器执行一次任务,同时传递分片参数,可以根据分片参数开发分片任务。

“分片广播”以执行器为维度进行分片,支持动态扩容执行器集群从而动态增加分片数量,协同进行业务处理;在进行大数据量业务操作时可显著提升任务处理能力和速度。

“分片广播”和普通任务开发流程一致,不同之处在于可以获取分片参数,通过分片参数进行分片业务处理。开发流程如下:

Step-1 开发JobHandler代码

在示例工程的com.example.demo.jobhandler包中,新建ShardingJobHandler任务类,关键代码如下所示:

上述代码的第9行获取分片参数,第10行获取分片参数的两个属性:

Step-2 新建调度任务

参考上文“任务调度属性”对新建的任务进行参数配置,运行模式选择“BEAN模式”,路由策略选择“分片广播”,JobHandler属性填写任务注解@JobHandler中定义的值,如下图所示:

调度中心会每隔15分钟广播调度一次shardingJobHandler任务。

分片广播的路由策略不仅适用于BEAN运行模式,而且也适用于GLUE(Java)运行模式。这项功能适用于以下业务场景:

5. 任务列表

在XXL-JOB调度中心,点击进入“任务管理”页面,可以看到指定执行器的任务列表,如下图所示:

在任务列表中,可以看到每个任务的任务ID、任务描述、运行模式、Cron、负责人和状态等信息。用户可以对任务进行以下几种操作:

七、任务调度日志

在XXL-JOB调度中心,点击进入“调度日志”页面。

1. 查看调度日志

在“调度日志”页面可以查看每次任务调度的调度结果、执行结果等信息,如下图所示:

从调度日志可以获取以下信息:

在示例工程中,调度日志位于/data/applogs/xxl-job/xxl-job-demo.log,可以在logback.xml文件中进行配置。

2. 查看执行日志

点击某行日志右侧的 “执行日志” 按钮,可跳转至执行日志界面,可以查看业务代码中打印的完整日志,如下图:

在示例工程中,执行日志位于/data/applogs/xxl-job/jobhandler目录中,可以在logback.xml文件中进行配置。

3. 终止运行中的任务

这项功能只针对执行中的任务。在任务日志页面,点击右侧的“终止任务”按钮,将会向本次任务对应的执行器发送任务终止请求,将会终止掉本次任务,同时会清空掉整个任务执行队列,如下图所示:

任务终止是通过“interrupt”执行线程的方式实现的,将会触发“InterruptedException”异常。因此,如果JobHandler内部捕获到该异常并消化掉的话,任务终止功能将不起作用。

因此, 如果遇到上述任务终止不起作用的情况, 需要在JobHandler中针对“InterruptedException”异常进行特殊处理(向上抛出)。另外,在JobHandler中开启子线程时,子线程也不可捕获处理“InterruptedException”,应该主动向上抛出。

4. 删除执行日志

在任务日志页面,选择执行器和任务之后,点击右侧的“清理”按钮将会出现“日志清理”弹框,弹框中支持选择不同类型的日志清理策略,选中后点击“确定”按钮即可进行日志清理操作,如下图所示:

详情介绍:

更新主题详情

420天以来,Java架构更新了 888个主题,已经有156+位同学加入。微信扫码关注java架构,获取Java面试题和架构师相关题目和视频。上述相关面试题答案,尽在Java架构中。

最后:特别感谢以下博客

1、分布式任务调度平台XXL-JOB搭建教程
2、XXL-JOB的基本用法

上一篇下一篇

猜你喜欢

热点阅读