数据处理网站开发,接送车服务网站怎么做,wordpress 死链提交,山西网站建设开发思维导图 文章已收录Github精选#xff0c;欢迎Star#xff1a;https://github.com/yehongzhi/learningSummary 一、概述
在平时的业务场景中#xff0c;经常有一些场景需要使用定时任务#xff0c;比如#xff1a;
时间驱动的场景#xff1a;某个时间点发送优惠券欢迎Starhttps://github.com/yehongzhi/learningSummary 一、概述
在平时的业务场景中经常有一些场景需要使用定时任务比如
时间驱动的场景某个时间点发送优惠券发送短信等等。批量处理数据批量统计上个月的账单统计上个月销售数据等等。固定频率的场景每隔5分钟需要执行一次。
所以定时任务在平时开发中并不少见而且对于现在快速消费的时代每天都需要发送各种推送消息都需要依赖定时任务去完成应用非常广泛。
二、为什么需要任务调度平台
在Java中传统的定时任务实现方案比如TimerQuartz等都或多或少存在一些问题
不支持集群、不支持统计、没有管理平台、没有失败报警、没有监控等等
而且在现在分布式的架构中有一些场景需要分布式任务调度
同一个服务多个实例的任务存在互斥时需要统一的调度。任务调度需要支持高可用、监控、故障告警。需要统一管理和追踪各个服务节点任务调度的结果需要记录保存任务属性信息等。
显然传统的定时任务已经不满足现在的分布式架构所以需要一个分布式任务调度平台目前比较主流的是elasticjob和xxl-job。
elasticjob由当当网开源目前github有6.5k的Star使用的公司在官网登记有76家。 跟xxl-job不同的是elasticjob是采用zookeeper实现分布式协调实现任务高可用以及分片。
三、为什么选择XXL-JOB
实际上更多公司选择xxl-job目前xxl-job的github上有15.7k个star登记公司有348个。毫无疑问elasticjob和xxl-job都是非常优秀的技术框架接下来我们进一步对比讨论探索一下为什么更多公司会选择xxl-job。
首先先介绍一下xxl-job这是出自大众点评许雪里(xxl就是作者名字的拼音首字母)的开源项目官网上介绍这是一个轻量级分布式任务调度框架其核心设计目标是开发迅速、学习简单、轻量级、易扩展。跟elasticjob不同xxl-job环境依赖于mysql不用ZooKeeper这也是最大的不同。
elasticjob的初衷是为了面对高并发复杂的业务即使是在业务量大服务器多的时候也能做好任务调度尽可能的利用服务器的资源。使用ZooKeeper使其具有高可用、一致性的而且还具有良好的扩展性。官网上写elasticjob是无中心化的通过ZooKeeper的选举机制选举出主服务器如果主服务器挂了会重新选举新的主服务器。因此elasticjob具有良好的扩展性和可用性但是使用和运维有一定的复杂。 xxl-job则相反是通过一个中心式的调度平台调度多个执行器执行任务调度中心通过DB锁保证集群分布式调度的一致性这样扩展执行器会增大DB的压力但是如果实际上这里数据库只是负责任务的调度执行。但是如果没有大量的执行器的话和任务的情况是不会造成数据库压力的。实际上大部分公司任务数执行器并不多(虽然面试经常会问一些高并发的问题)。
相对来说xxl-job中心式的调度平台轻量级开箱即用操作简易上手快与SpringBoot有非常好的集成而且监控界面就集成在调度中心界面又简洁对于企业维护起来成本不高还有失败的邮件告警等等。这就使很多企业选择xxl-job做调度平台。
四、安装
4.1 拉取源码
搭建xxl-job很简单有docker拉取镜像部署和源码编译两种方式docker部署的方式比较简单我就讲源码编译的方式。首先到github拉取xxl-job源码到本地。
4.2 导入IDEA
拉取源码下来后可以看到项目结构如下 导入到IDEA配置一下Maven下载相关的jar包稍等一下后就可以看到这样的项目 4.3 初始化数据库
前面讲过xxl-job需要依赖mysql所以需要初始化数据库在xxl-jobdocdb路径下找到tables_xxl_job.sql文件。在mysql上运行sql文件。 4.4 配置文件
接着就改一下配置文件在admin项目下找到application.properties文件。
### 调度中心JDBC链接
spring.datasource.urljdbc:mysql://127.0.0.1:3306/xxl_job?useUnicodetruecharacterEncodingUTF-8autoReconnecttrueserverTimezoneAsia/Shanghai
spring.datasource.usernameroot
spring.datasource.password
spring.datasource.driver-class-namecom.mysql.jdbc.Driver
### 报警邮箱
spring.mail.hostsmtp.qq.com
spring.mail.port25
spring.mail.usernamexxxqq.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
### 调度中心通讯TOKEN [选填]非空时启用
xxl.job.accessToken
### 调度中心国际化配置 [必填] 默认为 zh_CN/中文简体, 可选范围为 zh_CN/中文简体, zh_TC/中文繁体 and en/英文
xxl.job.i18nzh_CN
## 调度线程池最大线程配置【必填】
xxl.job.triggerpool.fast.max200
xxl.job.triggerpool.slow.max100
### 调度中心日志表数据保存天数 [必填]过期日志自动清理限制大于等于7时生效否则, 如-1关闭自动清理功能
xxl.job.logretentiondays10
4.5 编译运行
简单一点直接跑admin项目的main方法启动也行。 如果部署在服务器呢那我们需要打包成jar包在IDEA利用Maven插件打包。 然后在xxl-jobxxl-job-admintarget路径下找到jar包。 然后就得到jar包了使用java -jar命令就可以启动了。 到这里就已经完成了打开浏览器输入http://localhost:8080/xxl-job-admin进入管理页面。默认账号/密码admin/123456。
五、永远的HelloWord
部署了调度中心之后需要往调度中心注册执行器添加调度任务。接下来就参考xxl-job写一个简单的例子。
首先创建一个SpringBoot项目名字叫xxljob-demo添加依赖。
dependenciesdependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter/artifactId/dependencydependency!-- 官网的demo是2.2.1中央maven仓库还没有所以就用2.2.0 --groupIdcom.xuxueli/groupIdartifactIdxxl-job-core/artifactIdversion2.2.0/version/dependency
/dependencies
接着修改application.properties。
# web port
server.port8081
# log config
logging.configclasspath:logback.xml
spring.application.namexxljob-demo
### 调度中心部署跟地址 [选填]如调度中心集群部署存在多个地址则用逗号分隔。执行器将会使用该地址进行执行器心跳注册和任务结果回调为空则关闭自动注册
xxl.job.admin.addresseshttp://127.0.0.1:8080/xxl-job-admin
### 执行器通讯TOKEN [选填]非空时启用
xxl.job.accessToken
### 执行器AppName [选填]执行器心跳注册分组依据为空则关闭自动注册
xxl.job.executor.appnamexxl-job-demo
### 执行器注册 [选填]优先使用该配置作为注册地址为空时使用内嵌服务 ”IP:PORT“ 作为注册地址。从而更灵活的支持容器类型执行器动态IP和动态映射端口问题。
xxl.job.executor.address
### 执行器IP [选填]默认为空表示自动获取IP多网卡时可手动设置指定IP该IP不会绑定Host仅作为通讯实用地址信息用于 执行器注册 和 调度中心请求并触发任务
xxl.job.executor.ip
### 执行器端口号 [选填]小于等于0则自动获取默认端口为9999单机部署多个执行器时注意要配置不同执行器端口
xxl.job.executor.port9999
### 执行器运行日志文件存储磁盘路径 [选填] 需要对该路径拥有读写权限为空则使用默认路径
xxl.job.executor.logpath/data/applogs/xxl-job/jobhandler
### 执行器日志文件保存天数 [选填] 过期日志自动清理, 限制值大于等于3时生效; 否则, 如-1, 关闭自动清理功能
xxl.job.executor.logretentiondays10
接着写一个配置类XxlJobConfig。
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;}
}
接着编写一个任务类XxlJobDemoHandler使用Bean模式。
Component
public class XxlJobDemoHandler {/*** Bean模式一个方法为一个任务* 1、在Spring Bean实例中开发Job方法方式格式要求为 public ReturnTString execute(String param)* 2、为Job方法添加注解 XxlJob(value自定义jobhandler名称, init JobHandler初始化方法, destroy JobHandler销毁方法)注解value值对应的是调度中心新建任务的JobHandler属性的值。* 3、执行日志需要通过 XxlJobLogger.log 打印执行日志*/XxlJob(demoJobHandler)public ReturnTString demoJobHandler(String param) throws Exception {XxlJobLogger.log(java, Hello World~~~);XxlJobLogger.log(param: param);return ReturnT.SUCCESS;}
}
在resources目录下添加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
写完之后启动服务然后可以打开管理界面找到执行器管理添加执行器。 接着到任务管理添加任务。 最后我们可以到任务管理去测试一下运行demoJobHandler。 点击保存后会立即执行。点击查看日志可以看到任务执行的历史日志记录。 打开刚刚执行的执行日志我们可以看到运行成功。 这就是简单的Demo演示非常简单上手也快。
六、谈谈架构设计
下面简单地说一下xxl-job的架构我们先看官网提供的一张架构图来分析。 从架构图可以看出分别有调度中心和执行器两大组成部分
调度中心。负责管理调度信息按照调度配置发出调度请求自身不承担业务代码。支持可视化界面可以在调度中心对任务进行新增更新删除会实时生效。支持监控调度结果查看执行日志查看调度任务统计报表任务失败告警等等。执行器。负责接收调度请求执行调度任务的业务逻辑。执行器启动后需要注册到调度中心。接收调度中心的发出的执行请求终止请求日志请求等等。
接下来我们看一下xxl-job的工作原理。
任务执行器根据配置的调度中心的地址自动注册到调度中心。达到任务触发条件调度中心下发任务。执行器基于线程池执行任务并把执行结果放入内存队列中、把执行日志写入日志文件中。执行器的回调线程消费内存队列中的执行结果主动上报给调度中心。当用户在调度中心查看任务日志调度中心请求任务执行器任务执行器读取任务日志文件并返回日志详情。
絮叨
看完以上的内容基本算入门了。实际上xxl-job还有很多功能要深入学习还需要到官网去研究探索。最好就是自己在本地搭建一个xxl-job来玩玩动手实践是学得最快的学习方式。 原文链接 本文为阿里云原创内容未经允许不得转载。