wordpress网站如何搬家,南阳网网站建设,教做3d的网站,注册公司怎么注册文章目录1.什么是任务调度2.常见定时任务方案2.1. 传统定时任务方案示例2.2. 缺点分析3.什么是分布式任务调度#xff1f;3.1. 并行任务调度3.2. 高可用3.3. 弹性扩容3.4. 任务管理与监测4.市面上常见的分布式任务调度产品5.初识xxl-job6.xxl-job架构设计6.1.设计思想6.2.架构…
文章目录1.什么是任务调度2.常见定时任务方案2.1. 传统定时任务方案示例2.2. 缺点分析3.什么是分布式任务调度3.1. 并行任务调度3.2. 高可用3.3. 弹性扩容3.4. 任务管理与监测4.市面上常见的分布式任务调度产品5.初识xxl-job6.xxl-job架构设计6.1.设计思想6.2.架构设计图7.环境搭建7.1.调度中心环境要求7.2.源码仓库地址7.3.初始化“调度数据库”7.4.编译源码7.5.配置部署“调度中心”8.入门案例编写8.1.搭建springboot项目(执行器)8.2.配置执行器8.3.测试1.什么是任务调度
我们可以先思考一下业务场景的解决方案
某电商系统需要在每天上午10点下午3点晚上8点发放一批优惠券。某银行系统需要在信用卡到期还款日的前三天进行短信提醒。某财务系统需要在每天凌晨0:10结算前一天的财务数据统计汇总。12306会根据车次的不同设置某几个时间点进行分批放票。
以上业务场景的解决方案就是任务调度。 任务调度是指系统为了自动完成特定任务在约定的特定时刻去执行任务的过程。有了任务调度即可解放更多的人力而是由系统自动去执行任务。 2.常见定时任务方案 While Sleep : 通过循环加休眠的方式定时执行 Timer和TimerTask实现 JDK自带的定时任务可以实现简单的间隔执行任务在指定时间点执行某一任务也能定时的周期性执行无法实现按日历去调度执行任务。 ScheduledExecutorService : Java并发包下JDK1.5出现是比较理想的定时任务实现方案。Eureka就使用的是它 QuartZ: 使用Quartz它是一个异步任务调度框架功能丰富可以实现按日历调度,支持持久化。 Spring TaskSpring 3.0后提供Spring Task实现任务调度支持按日历调度相比Quartz功能稍简单但是在开发基本够用支持注解编程方式。 SpringBoot中的Schedule 通过EnableSchedulingScheduled最实现定时任务底层使用的是Spring Task
2.1. 传统定时任务方案示例
spring框架中默认就支持了一个任务调度spring-task
1创建一个工程spring-task-demo
pom文件 parentgroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-parent/artifactIdversion2.2.5.RELEASE/version/parentdependenciesdependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependency/dependencies2引导类
在启动类上使用EnableScheduling注解表示开启定时任务
SpringBootApplication
EnableScheduling
public class TaskApplication {public static void main(String[] args) {SpringApplication.run(TaskApplication.class,args);}
}(3)编写案例
根据业务需要在方法上使用Scheduled注解cron属性配置定时规则
Component
public class ScheduledTask {private final static Logger logger LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());Scheduled(cron 0/10 * * * * ?) //每10秒执行一次public void scheduledTaskByCorn() {logger.info(定时任务开始 ByCorn new Date());scheduledTask();logger.info(定时任务结束 ByCorn new Date());}private void scheduledTask() {try {Thread.sleep(5000);} catch (InterruptedException e) {e.printStackTrace();}}
}(4)运行 启动项目就可以看控制台看到定时任务执行效果
2.2. 缺点分析
上述的定时任务都是集中式(单体项目使用)的定时任务在分布式中将会面临一些问题或不足
不支持集群集群情况下容易造成任务重复问题不支持失败重试失败即结束不支持重试不支持动态调整修改任务参数时需要修改代码并且要重启服务无报警机制任务失败后没有提醒功能无统一管理没有办法手动关闭或开启任务
3.什么是分布式任务调度
当前软件的架构已经开始向分布式架构转变将单体结构拆分为若干服务服务之间通过网络交互来完成业务处理。在分布式架构下一个服务往往会部署多个实例来运行我们的业务如果在这种分布式系统环境下运行任务调度我们称之为分布式任务调度。 将任务调度程序分布式构建这样就可以具有分布式系统的特点并且提高任务的调度处理能力
3.1. 并行任务调度
并行任务调度实现靠多线程如果有大量任务需要调度此时光靠多线程就会有瓶颈了因为一台计算机CPU的处理能力是有限的。
如果将任务调度程序分布式部署每个结点还可以部署为集群这样就可以让多台计算机共同去完成任务调度我们可以将任务分割为若干个分片由不同的实例并行执行来提高任务调度的处理效率。
3.2. 高可用
若某一个实例宕机不影响其他实例来执行任务。
3.3. 弹性扩容
当集群中增加实例就可以提高并执行任务的处理效率。
3.4. 任务管理与监测
对系统中存在的所有定时任务进行统一的管理及监测。让开发人员及运维人员能够时刻了解任务执行情况从而做出快速的应急处理响应。
4.市面上常见的分布式任务调度产品
针对分布式任务调度的需求市场上出现了很多的产品
1 TBSchedule淘宝推出的一款非常优秀的高性能分布式调度框架目前被应用于阿里、京东、支付宝、国美等很多互联网企业的流程调度系统中。但是已经多年未更新文档缺失严重缺少维护。
2 XXL-Job大众点评的分布式任务调度平台是一个轻量级分布式任务调度平台, 其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线开箱即用。
3Elastic-job当当网借鉴TBSchedule并基于quartz 二次开发的弹性分布式任务调度系统功能丰富强大采用zookeeper实现分布式协调具有任务高可用以及分片功能。
4Saturn 唯品会开源的一个分布式任务调度平台基于Elastic-job可以全域统一配置统一监控具有任务高可用以及分片功能。
5.初识xxl-job
XXL-JOB是一个开源的具有丰富的任务管理功能以及高性能高可用等特点的轻量级分布式任务调度平台其核心设计目标是开发迅速、学习简单、轻量级、易扩展、开箱即用
于2015问世其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线开箱即用。其具备且不止如下能力 简单支持通过Web页面对任务进行CRUD操作操作简单一分钟上手 动态支持动态修改任务状态、启动/停止任务以及终止运行中任务即时生效 调度中心HA中心式调度采用中心式设计“调度中心”基于集群Quartz实现并支持集群部署可保证调度中心HA执行器HA分布式任务分布式执行任务执行器支持集群部署可保证任务执行HA 弹性扩容缩容一旦有新执行器机器上线或者下线下次调度时将会重新分配任务 路由策略执行器集群部署时提供丰富的路由策略包括第一个、最后一个、轮询、随机、一致性HASH、最不经常使用、最近最久未使用、故障转移、忙碌转移等 故障转移任务路由策略选择故障转移情况下如果执行器集群中某一台机器故障将会自动Failover切换到一台正常的执行器发送调度请求。 任务失败告警默认提供邮件方式失败告警同时预留扩展接口可方面的扩展短信、钉钉等告警方式
源码地址https://gitee.com/xuxueli0323/xxl-job
文档地址https://www.xuxueli.com/xxl-job/
6.xxl-job架构设计
6.1.设计思想
将调度行为抽象形成“调度中心”公共平台而平台自身并不承担业务逻辑“调度中心”负责发起调度请求。
将任务抽象成分散的JobHandler交由“执行器”统一管理“执行器”负责接收调度请求并执行对应的JobHandler中业务逻辑。因此“调度”和“任务”两部分可以相互解耦提高系统整体稳定性和扩展性
6.2.架构设计图
xxl-job分为 调度中心和执行器两大模块
调度模块调度中心 负责管理调度信息按照调度配置发出调度请求自身不承担业务代码。调度系统与任务解耦提高了系统可用性和稳定性同时调度系统性能不再受限于任务模块 支持可视化、简单且动态的管理调度信息包括任务新建更新删除任务报警等所有上述操作都会实时生效同时支持监控调度结果以及执行日志支持执行器Failover
执行模块执行器 负责接收调度请求并执行任务逻辑。任务模块专注于任务的执行等操作开发和维护更加简单和高效 接收“调度中心”的执行请求、终止请求和日志请求等 调度中心负责管理调度信息按照调度配置发出调度请求自身不承担业务代码。 任务执行器负责接收调度请求并执行任务逻辑。 任务专注于任务的处理。
调度中心会发出调度请求任务执行器接收到请求之后会去执行任务任务则专注于任务业务的处理。
7.环境搭建
7.1.调度中心环境要求
Maven3Jdk1.8Mysql5.7
7.2.源码仓库地址
github: https://github.com/xuxueli/xxl-jobgitee: http://gitee.com/xuxueli0323/xxl-job
7.3.初始化“调度数据库”
请下载项目源码并解压获取 “调度数据库初始化SQL脚本” 并执行即可。
位置/xxl-job/doc/db/tables_xxl_job.sql 共8张表 xxl_job_lock任务调度锁表xxl_job_group执行器信息表维护任务执行器信息xxl_job_info调度扩展信息表用于保存XXL-JOB调度任务的扩展信息如任务分组、任务名、机器地址、执行器、执行入参和报警邮件等等xxl_job_log调度日志表用于保存XXL-JOB任务调度的历史信息如调度结果、执行结果、调度入参、调度机器和执行器等等xxl_job_log_report调度日志报表用户存储XXL-JOB任务调度日志的报表调度中心报表功能页面会用到xxl_job_logglue任务GLUE日志用于保存GLUE更新历史用于支持GLUE的版本回溯功能xxl_job_registry执行器注册表维护在线的执行器和调度中心机器地址信息xxl_job_user系统用户表 调度中心支持集群部署集群情况下各节点务必连接同一个mysql实例; 如果mysql做主从,调度中心集群节点务必强制走主库; 7.4.编译源码
解压源码,按照maven格式将源码导入IDE, 使用maven进行编译即可源码结构如下
doc 文档即SQL脚本所在目录db : “调度数据库”建表脚本xxl-job-admin : 调度中心项目源码xxl-job-core : 核心模块,公共Jar依赖xxl-job-executor-samples : 执行器Sample示例项目大家可以在该项目上进行开发也可以将现有项目改造生成执行器项目
7.5.配置部署“调度中心”
调度中心项目xxl-job-admin 作用统一管理任务调度平台上调度任务负责触发调度执行并且提供任务管理平 台。
步骤一调度中心配置
调度中心配置文件地址/xxl-job/xxl-job-admin/src/main/resources/application.properties 数据库的连接信息修改为自己的数据库
### web
server.port8080
server.servlet.context-path/xxl-job-admin### actuator
management.server.servlet.context-path/actuator
management.health.mail.enabledfalse### resources
spring.mvc.servlet.load-on-startup0
spring.mvc.static-path-pattern/static/**
spring.resources.static-locationsclasspath:/static/### freemarker
spring.freemarker.templateLoaderPathclasspath:/templates/
spring.freemarker.suffix.ftl
spring.freemarker.charsetUTF-8
spring.freemarker.request-context-attributerequest
spring.freemarker.settings.number_format0.############# mybatis
mybatis.mapper-locationsclasspath:/mybatis-mapper/*Mapper.xml
#mybatis.type-aliases-packagecom.xxl.job.admin.core.model### xxl-job, datasource
spring.datasource.urljdbc:mysql://127.0.0.1:3306/xxl_job?useUnicodetruecharacterEncodingUTF-8autoReconnecttrueserverTimezoneAsia/Shanghai
spring.datasource.usernameroot
spring.datasource.password123456
spring.datasource.driver-class-namecom.mysql.cj.jdbc.Driver### datasource-pool
spring.datasource.typecom.zaxxer.hikari.HikariDataSource
spring.datasource.hikari.minimum-idle10
spring.datasource.hikari.maximum-pool-size30
spring.datasource.hikari.auto-committrue
spring.datasource.hikari.idle-timeout30000
spring.datasource.hikari.pool-nameHikariCP
spring.datasource.hikari.max-lifetime900000
spring.datasource.hikari.connection-timeout10000
spring.datasource.hikari.connection-test-querySELECT 1
spring.datasource.hikari.validation-timeout1000### xxl-job, email
spring.mail.hostsmtp.qq.com
spring.mail.port25
spring.mail.usernamexxxqq.com
spring.mail.fromxxxqq.com
spring.mail.passwordxxx
spring.mail.properties.mail.smtp.authtrue
spring.mail.properties.mail.smtp.starttls.enabletrue
spring.mail.properties.mail.smtp.starttls.requiredtrue
spring.mail.properties.mail.smtp.socketFactory.classjavax.net.ssl.SSLSocketFactory### xxl-job, access token
xxl.job.accessTokendefault_token### xxl-job, i18n (default is zh_CN, and you can choose zh_CN, zh_TC and en)
xxl.job.i18nzh_CN## xxl-job, triggerpool max size
xxl.job.triggerpool.fast.max200
xxl.job.triggerpool.slow.max100### xxl-job, log retention days
xxl.job.logretentiondays30步骤二部署项目
如果已经正确进行上述配置可将项目编译打包部署。这是一个springboot项目也可以在idea中直接启动.
调度中心访问地址http://localhost:8080/xxl-job-admin (该地址执行器将会使用到作为回调地址) 用户名和密码admin/123456 至此“调度中心”项目已经部署成功。
8.入门案例编写
8.1.搭建springboot项目(执行器)
新建项目在test模块下新建xxl-job-demo子模块
1pom文件 dependenciesdependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependency!--xxl-job--dependencygroupIdcom.xuxueli/groupIdartifactIdxxl-job-core/artifactIdversion2.3.0/version/dependency/dependencies(2)配置有两个一个是application.yml另外一个是日志配置:logback.xml
# web port
server.port8881
# no web
#spring.main.web-environmentfalse# log config
logging.configclasspath:logback.xml### xxl-job admin address list, such as http://address or http://address01,http://address02
xxl.job.admin.addresseshttp://127.0.0.1:8080/xxl-job-admin### xxl-job, access token
xxl.job.accessTokendefault_token### xxl-job executor appname
xxl.job.executor.appnamexxl-job-executor-test
### 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
xxl.job.executor.port9999
### xxl-job executor log-path
xxl.job.executor.logpath/data/applogs/xxl-job/jobhandler
### xxl-job executor log-retention-days
xxl.job.executor.logretentiondays30 检查执行器中appname是否为xxl_job_sharding_sample logback.xml
?xml version1.0 encodingUTF-8?
configuration debugfalse scantrue scanPeriod1 secondscontextNamelogback/contextNameproperty namelog.path value/data/applogs/xxl-job/xxl-job-executor-sample-springboot.log/appender nameconsole classch.qos.logback.core.ConsoleAppenderencoderpattern%d{HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{36} - %msg%n/pattern/encoder/appenderappender namefile classch.qos.logback.core.rolling.RollingFileAppenderfile${log.path}/filerollingPolicy classch.qos.logback.core.rolling.TimeBasedRollingPolicyfileNamePattern${log.path}.%d{yyyy-MM-dd}.zip/fileNamePattern/rollingPolicyencoderpattern%date %level [%thread] %logger{36} [%file : %line] %msg%n/pattern/encoder/appenderroot levelinfoappender-ref refconsole/appender-ref reffile//root/configuration
(3)引导类
package com.xxl.job;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;SpringBootApplication
public class XxlJobApplication {public static void main(String[] args) {SpringApplication.run(XxlJobApplication.class,args);}
}
4添加xxl-job配置
添加配置类
这个类主要是创建了任务执行器参考官方案例编写无须改动
package com.xxl.job.config;import com.xxl.job.core.executor.impl.XxlJobSpringExecutor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;/*** xxl-job config*/
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;Beanpublic 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;}
}
5创建任务
package com.xxl.job.config;import com.xxl.job.core.biz.model.ReturnT;
import com.xxl.job.core.handler.annotation.XxlJob;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;import java.time.LocalDateTime;Component
public class HelloJob {Value(${server.port})private String port;XxlJob(demoJobHandler)public ReturnT helloJob() {System.out.println(简单任务执行了。。。。 port);return ReturnT.SUCCESS;}
}
XxlJob(“demoJobHandler”)这个一定要与调度中心新建任务的JobHandler的值保持一致
8.2.配置执行器
在任务调度中心点击进入执行器管理界面, 如下图: 1、此处的AppName,会在创建任务时被选择每个任务必然要选择一个执行器。
2、“执行器列表” 中显示在线的执行器列表, 支持编辑删除。
以下是执行器的属性说明
属性名称说明AppName是每个执行器集群的唯一标示AppName, 执行器会周期性以AppName为对象进行自动注册。可通过该配置自动发现注册成功的执行器, 供任务调度时使用;名称执行器的名称, 因为AppName限制字母数字等组成,可读性不强, 名称为了提高执行器的可读性;排序执行器的排序, 系统中需要执行器的地方,如任务新增, 将会按照该排序读取可用的执行器列表;注册方式调度中心获取执行器地址的方式机器地址注册方式为手动录入时有效支持人工维护执行器的地址信息
具体操作
1新增执行器 xxl-job-executor-test
2在调度中心新建任务 在任务管理-新建填写以下内容
8.3.测试
1首先启动调度中心xxl-job-admin
2启动xxl-job-demo项目
3启动任务任务调度中心 4打开idea控制台查看任务执行情况