顺义深圳网站建设公司,长沙市建设厅网站,海南在线天涯论坛,h5企业模板网站模板【XXL-JOB】XXL-JOB的搭建和使用 文章目录【XXL-JOB】XXL-JOB的搭建和使用1. 任务调度1.1 实现任务调度1.1.1 多线程实现1.1.2 Timer实现1.1.3 ScheduledExecutor实现2. 分布式任务调度2.1 采用分布式的原因3. XXL-JOB3.1 XXL-JOB介绍3.2 执行流程4. 搭建XXL-JOB4.1 创建数据库…【XXL-JOB】XXL-JOB的搭建和使用 文章目录【XXL-JOB】XXL-JOB的搭建和使用1. 任务调度1.1 实现任务调度1.1.1 多线程实现1.1.2 Timer实现1.1.3 ScheduledExecutor实现2. 分布式任务调度2.1 采用分布式的原因3. XXL-JOB3.1 XXL-JOB介绍3.2 执行流程4. 搭建XXL-JOB4.1 创建数据库4.2 导入依赖配置执行器4.3 调度中心配置4.4 执行任务4.5 查看日志4.6 停止任务1. 任务调度
任务调度顾名思义就是对任务的调度它是指系统为了完成特定业务基于给定时间点给定时间间隔或者给定执行次数自动执行任务。
那么我们如何去高效的处理一批任务呢这里有两种方案
多线程(多线程可以充分利用单机的资源)分布式多线程(充分利用多台计算机资源每台计算机使用多线程)
方案2的可扩展性更强这是一种分布式任务调度的处理方案。
那么什么又是分布式任务调度呢
给定多个场景
某电商系统需要在每天上午10点下午3点晚上8点发放一批优惠券。某财务系统需要在每天上午10点前结算前一天的账单数据统计汇总。某电商平台每天凌晨3点要对订单中的无效订单进行清理。12306网站会根据车次不同设置几个时间点分批次放票。。。。。。。
以上这些问题就是任务调度需要解决的问题。 1.1 实现任务调度
1.1.1 多线程实现
我们可以开启一个线程每隔一段时间就去执行一个任务。
如下代码所示
这个程序的功能是每隔1s执行一次。
public static void main(String[] args) { //任务执行间隔时间final long timeInterval 1000;Runnable runnable new Runnable() {public void run() {while (true) {//TODOsomethingtry {Thread.sleep(timeInterval);} catch (InterruptedException e) {e.printStackTrace();}}}};Thread thread new Thread(runnable);thread.start();
}Jdk也为我们提供了相关支持如Timer、ScheduledExecutor。 1.1.2 Timer实现
如下代码的功能是1s之后开始调度并且每隔2s执行一次。
public static void main(String[] args){ Timer timer new Timer(); timer.schedule(new TimerTask(){Override public void run() { //TODOsomething} }, 1000, 2000); //1秒后开始调度每2秒执行一次
}Timer 的优点在于简单易用每个Timer对应一个线程因此可以同时启动多个Timer并行执行多个任务同一个Timer中的任务是串行执行。 1.1.3 ScheduledExecutor实现
public static void main(String [] agrs){ScheduledExecutorService service Executors.newScheduledThreadPool(10);service.scheduleAtFixedRate(new Runnable() {Overridepublic void run() {//TODOsomethingSystem.out.println(todo something);}}, 1,2, TimeUnit.SECONDS);
}Java 5 推出了基于线程池设计的 ScheduledExecutor其设计思想是每一个被调度的任务都会由线程池中一个线程去执行因此任务是并发执行的相互之间不会受到干扰。 2. 分布式任务调度
通常任务调度的程序是集成在应用中的比如优惠卷服务中包括了定时发放优惠卷的的调度程序结算服务中包括了定期生成报表的任务调度程序由于采用分布式架构一个服务往往会部署多个冗余实例来运行我们的业务在这种分布式系统环境下运行任务调度我们称之为分布式任务调度。
如下图 2.1 采用分布式的原因
不管是任务调度程序集成在应用程序中还是单独构建的任务调度系统如果采用分布式调度任务的方式就相当于将任务调度程序分布式构建这样就可以具有分布式系统的特点并且提高任务的调度处理能力。
所以分布式调度要实现的目标是
并行任务调度 并行任务调度实现靠多线程如果有大量任务需要调度此时光靠多线程就会有瓶颈了因为一台计算机CPU的处理能力是有限的。如果将任务调度程序分布式部署每个结点还可以部署为集群这样就可以让多台计算机共同去完成任务调度我们可以将任务分割为若干个分片由不同的实例并行执行来提高任务调度的处理效率。高可用若某一个实例宕机不影响其他实例来执行任务。弹性扩容当集群中增加实例就可以提高并行任务的处理效率。任务管理与监测对系统中存在的所有定时任务进行统一的管理及监测。让开发人员及运维人员能够时刻了解任务执行情况从而做出快速的应急处理响应。避免任务重复执行当任务调度以集群方式部署同一个任务调度可能会执行多次比如在上面提到的电商系统中到点发优惠券的例子就会发放多次优惠券对公司造成很多损失所以我们需要控制相同的任务在多个运行实例上只执行一次。 注第五点尤为重要。 3. XXL-JOB
3.1 XXL-JOB介绍
XXL-JOB是一个轻量级分布式任务调度平台其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线开箱即用。
官网XXL-JOB
文档XXL-JOB文档
XXL-JOB主要有调度中心、执行器、任务 调度中心 负责管理调度信息按照调度配置发出调度请求自身不承担业务代码主要职责为执行器管理、任务管理、监控运维、日志管理等 执行器 负责接收调度请求并执行任务逻辑主要职责是注册服务、任务执行服务接收到任务后会放入线程池中的任务队列、执行结果上报、日志服务等 任务 负责执行具体的业务处理。 3.2 执行流程
调度中心与执行器之间的工作流程如下 执行流程
任务执行器根据配置的调度中心的地址自动注册到调度中心达到任务触发条件调度中心下发任务执行器基于线程池执行任务并把执行结果放入内存队列中把执行日志写入日志文件中执行器消费内存队列中的执行结果主动上报给调度中心。当用户在调度中心查看任务日志调度中心请求任务执行器任务执行器读取任务日志文件并返回日志详情。 4. 搭建XXL-JOB
首先下载XXL-JOB
GitHubhttps://github.com/xuxueli/xxl-jobGiteehttps://gitee.com/xuxueli0323/xxl-job
下载后使用idea打开项目 项目模块有三个
xxl-job-admin调度中心xxl-job-core项目的核心包xxl-job-executor-samples执行器示例代码(可参考) xxl-job-executor-sample-springbootSpringboot版本通过Springboot管理执行器推荐这种方式xxl-job-executor-sample-frameless无框架版本 doc文档资料包含数据库脚本
4.1 创建数据库
创建数据库并导入doc文档中的数据库脚本 导入成功之后运行xxl-job-admin项目登陆账号为admin密码为123456 4.2 导入依赖配置执行器
1导入依赖
在我们需要执行任务调度的模块中导入如下依赖
dependencygroupIdcom.xuxueli/groupIdartifactIdxxl-job-core/artifactId
/dependency2yml配置
在配置文件(可以在nacos或本地文件)中配置
xxl:job:admin: addresses: http://localhost:8080/xxl-job-adminexecutor:appname: media-process-service #执行器名字(很重要在调度中心要用到)address: ip: port: 9999 #执行器端口号logpath: /data/applogs/xxl-job/jobhandlerlogretentiondays: 30accessToken: default_token3配置xxl-job的执行器
将示例工程下的配置类拷贝到自己的service工程下 4.3 调度中心配置
进入调度中心添加执行器 点击新增弹出如下对话框 图中的 AppName 填我们上面配置文件中配置的执行器名字名称随意。其他的可以不填。
填写完毕之后点击保存。 重新运行我们的项目如果控制台中输出如下内容说明执行器在调度中心注册成功 同时我们可以在调度中心中查看到执行器的地址 4.4 执行任务
我们复制示例工程中的 SampleXxjJob 到我们的项目中 我们删除部分代码只留如下代码(任务代码)
Component
public class SampleXxlJob {private static Logger logger LoggerFactory.getLogger(SampleXxlJob.class);/*** 1、简单任务示例Bean模式*/XxlJob(demoJobHandler)//记住这个名字后面要使用public void demoJobHandler() throws Exception {XxlJobHelper.log(XXL-JOB, Hello World.);for (int i 0; i 5; i) {XxlJobHelper.log(beat at: i);TimeUnit.SECONDS.sleep(2);}// default success}
}1在调度中心添加任务
进入调度中心在任务管理中新增任务 点击新增填写任务信息 注意红色标记处
调度类型选择Cron并配置Cron表达式设置定时策略。
Cron表达式是一个字符串通过它可以定义调度策略格式如下
{秒数} {分钟} {小时} {日期} {月份} {星期} {年份(可为空)}
xxl-job提供图形界面去配置 运行模式有BEAN和GLUEbean模式较常用就是在项目工程中编写执行器的任务代码GLUE是将任务代码编写在调度中心。
JobHandler任务方法名填写XxlJob注解中的名称。
添加成功后启动任务。 4.5 查看日志
点击左侧菜单栏“调度日志”即可查看任务执行情况 任务执行了一段之间要注意清理日志点击右上角的“清理”按钮即可。 4.6 停止任务
如果想要停止任务需要在调度中心中操作