定时任务,宋哥之前写了很多文章介绍给大家。上次他DIY了一个可以动态编辑的定时任务,并录制了一段配套视频:相关资料链接:春天定时任务玩花!一步步教你自定义编辑定时任务!开发可配置的定时任务~第二个Vue非典型用法,一个简单的管理页面,但是我们当时写的那个不支持分布式环境,支持起来也不难。弄个zookeeper或者redis作为公共的信息中心,记录定时任务的各种运行情况,以此来支持分布式环境。今天先不自己写了,先看一个现成的框架:ElasticJob,有个xxljob和他同名,这个我们后面再介绍。一、ElasticJob1.1简介ElasticJob是一个分布式的作业调度解决方案。其官网为:http://shardingsphere.apache....ElasticJob的前身是分布式任务调度框架dd-job,但于2020年5月28日加入Apache基金会,成为Apache下的开源项目:https://shardingsphere.apache...ElasticJob创建了一个适合互联网场景的分布式调度方案,通过开放的架构设计提供多元化的运行生态。使用ElasticJob可以让开发工程师不再担心任务线性吞吐量提升等非功能需求,从而可以更专注于面向业务的编码设计;同时,也可以解放运维工程师,让他们不再担心任务可用性和相关管理需求,只需轻松添加服务节点即可达到自动化运维的目的。ElasticJob是一个面向互联网生态和海量任务的分布式调度方案。它由两个独立的子项目组成,ElasticJob-Lite和ElasticJob-Cloud。其中,ElasticJob-Lite定位为轻量级去中心化解决方案,以jar形式为分布式任务提供协调服务;ElasticJob-Cloud采用自研MesosFramework方案,额外提供资源管理、应用分发、进程隔离其他功能:ElasticJob-LiteVSElasticJob-Cloud:ElasticJob-LiteElasticJob-CloudDecentralization资源分配是否支持job模式常驻常驻+瞬时部署依赖于ZooKeeperZooKeeper+Mesos其产品使用统一的作业API,开发人员只需要一次开发,可以随意部署(即ElasticJob-Lite和ElasticJob-Cloud使用相同的API,主要是在不同部署方法)。1.2功能列表弹性调度支持分布式场景下任务的分片和高可用可以横向扩展任务的吞吐量和执行效率任务处理能力可以根据资源分配分配资源。使其有效相同任务聚合到同一个执行者统一处理动态分配额外资源给新分配的任务DAG)依托基于有向无环图(DAG)的作业分片依托作业开放生态可扩展的作业类型统一接口丰富的作业类型库,如数据流、脚本、HTTP、文件、大数据等,轻松对接业务jobs,能够与Spring依赖注入无缝集成可视化运维平台(https://github.com/apache/sha...)Job管控端Job执行历史数据跟踪Registry管理2.实践说了这么多,接下来我们就通过一个简单的案例来体验一下ElasticJob。毕竟有代码,感觉更真实。首先我们创建一个SpringBoot工程,引入Web依赖:然后手动添加ElasticJob的starter:3.0.1接下来,我们创建一个作业。有几种不同的方法可以创建工作。先看一个基于实现SimpleJob接口创建的作业:/***@author江南小雨*@微信公众号江南小雨*@Websitehttp://www.itboyhub.com*@国际站http://www.javaboy.org*@WeChata_java_boy*@GitHubhttps://github.com/lenve*@Giteehttps://gitee.com/lenve*/@ComponentpublicclassMyFirstJobimplementsSimpleJob{privatestaticfinalLoggerlogger=LoggerFactory.getLogger(MyFirstJob.class);@Overridepublicvoidexecute(ShardingContextshardingContext){logger.info("作业名称:{};作业参数:{};分片总数:{};当前分片:{};分片参数:{};任务编号:{}",shardingContext.getJobName(),shardingContext.getJobParameter(),shardingContext.getShardingTotalCount(),shardingContext.getShardingItem(),shardingContextt.getShardingParameter(),shardingContext.getTaskId());}}当定时任务执行时,会触发execute方法,定时任务相关的参数存放在参数ShardingContext中,这些参数都是在application.properties中配置的,我们继续看:elasticjob.reg-center.server-lists=zoo1:2181,zoo2:2182,zoo3:2183elasticjob.reg-center.namespace=javaboyelasticjob.jobs.my-first-job.elastic-job-class=org.javaboy.elasticjob.job.MyFirstJobelasticjob.jobs.my-first-job.cron=0/3****?elasticjob.jobs.my-first-job.sharding-total-count=1elasticjob.jobs。my-first-job.overwrite=trueelasticjob.jobs.my-first-job.job-parameter=你好javaboy!elasticjob.jobs.my-first-job.sharding-item-parameters=0=A,1=B,2=C这里的配置分为两类:注册中心配置定时任务配置使用ElasticJob需要注册中心zookeeper,这个很容易理解,因为ElasticJob在分布式场景下支持任务分片和高可用,所以需要一个调度器中心,这个zk是调度中心。我这里开了一个zk集群,里面有3个实例,三个zk地址之间用.隔开。同时,我们还需要配置一个命名空间。这个命名空间的作用是防止不同应用程序的定时任务发生冲突。我们为每个应用选择一个不同于其他应用的命名空间,这样就不用担心冲突了。接下来是配置工作。配置作业的前缀统一为elasticjob.jobs,后面是作业名称。这个job名称可以随意配置,但是最好能一眼就看出是哪个job。MyFirstJob#execute方法中的shardingContext.getJobName()得到的就是这个值。我们这里一共配置了六个属性,我来一一说明:elastic-job-class:job的完整路径。cron:cron表达式。sharding-total-count:分片总数,即有多少实例执行当前的定时任务。该值由MyFirstJob#execute方法中的shardingContext.getShardingTotalCount()获取。overwrite:每次启动时是否覆盖之前的配置。如果设置为false,如果修改了cron表达式,重启后不会生效。job-parameter:作业的参数,即MyFirstJob#execute方法中shardingContext.getJobParameter()获取的值。sharding-item-parameters:分片参数,0、1、2代表分片个数,是MyFirstJob#execute方法中shardingContext.getShardingParameter()得到的值。好了,现在配置完成了。3.运行现在我们直接启动SpringBoot项目。启动后,控制台会打印如下日志:没问题,每三秒打印一次日志。现在我们再次启动当前项目的一个实例,勾选Allowparallelruntostartmultipleinstances(记得在启动新实例时修改端口号):当新实例启动时,我们发现并没有打印日志,并且在第二次启动的实例中打印日志。这是因为我们配置的sharding-total-count为1,即实例中只有一个定时任务同时运行。3、运维平台ElasticJob提供了一个运维平台,可以动态管理定时任务。运维平台地址:https://github.com/apache/shardingsphere-elasticjob-ui运维平台使用步骤:clone项目下载:gitclonehttps://github.com/apache/shardingsphere-elasticjob-ui。混帐。进入目录:cdshardingsphere-elasticjob-ui。打包:mvncleanpackage-Release。打包完成后,解压shardingsphere-elasticjob-ui/shardingsphere-elasticjob-ui-distribution/shardingsphere-elasticjob-lite-ui-bin-distribution/target/apache-shardingsphere-elasticjob-3.1.0-SNAPSHOT-lite-ui-bin.tar.gz文件,然后执行其bin目录下的startup.sh脚本启动。上面第三步打包由于网络原因容易出错,所以如果打包失败,可以在公众号江南一点鱼后台回复shardingsphere-elasticjob-ui获取松哥打包后的文件。运维平台启动后,在浏览器中输入http://localhost:8088,跳转到登录页面,如下:默认用户名和密码都是root。注册成功后,先点击注册中心配置,然后选择添加按钮,先添加注册中心。添加注册中心后,运维平台会自动从注册中心读取定时任务信息:如实填写即可,注意名称空格不要写错,否则不会能够阅读计划任务。接下来点击连接按钮,与zk建立连接:点击作业维度,可以查看作业的详细信息,包括作业名称、分片总数、cron表达式等:最后有四个操作按钮:modify:修改Job的详细信息,比如修改job的cronexpression。详细信息:查看作业的详细信息。触发器:触发作业的执行。Invalidation:相当于暂停了job的执行。点击失效按钮后,会出现验证按钮。点击Validation按钮,作业生效并继续执行。终止:停止工作。点击服务器维度可以查看服务器信息:4.总结好了,今天我就通过一个简单的案例来给大家介绍一下ElasticJob的玩法。ElasticJob的其他玩法我们后面会继续说~本文案例下载地址:https://github.com/lenve/javaboy-code-samples