佛山骏域网站建设百度指数搜索热度

diannao/2026/1/18 8:13:29/文章来源:
佛山骏域网站建设,百度指数搜索热度,兰州酒店网站建设,asp网站栏目如何修改1、调度中心 调度中心是一个单独的Web服务#xff0c;主要是用来触发定时任务的执行 它提供了一些页面操作#xff0c;我们可以很方便地去管理这些定时任务的触发逻辑 调度中心依赖数据库#xff0c;所以数据都是存在数据库中的 调度中心也支持集群模式#xff0c;但是…1、调度中心 调度中心是一个单独的Web服务主要是用来触发定时任务的执行 它提供了一些页面操作我们可以很方便地去管理这些定时任务的触发逻辑 调度中心依赖数据库所以数据都是存在数据库中的 调度中心也支持集群模式但是它们所依赖的数据库必须是同一个 所以同一个集群中的调度中心实例之间是没有任何通信的数据都是通过数据库共享的 2、执行器 执行器是用来执行具体的任务逻辑的 执行器你可以理解为就是平时开发的服务一个服务实例对应一个执行器实例 每个执行器有自己的名字为了方便你可以将执行器的名字设置成服务名 3、任务 一个执行器中也是可以有多个任务的 总的来说调用中心是用来控制定时任务的触发逻辑而执行器是具体执行任务的这是一种任务和触发逻辑分离的设计思想这种方式的好处就是使任务更加灵活可以随时被调用还可以被不同的调度规则触发。 来个Demo 1、搭建调度中心 调度中心搭建很简单先下载源码 github.com/xuxueli/xxl… 然后改一下数据库连接信息执行一下在项目源码中的/doc/db下的sql文件 启动可以打成一个jar包或者本地启动就是可以的 启动完成之后访问下面这个地址就可以访问到控制台页面了 http://localhost:8080/xxl-job-admin/toLogin 用户名密码默认是 admin/123456 2、执行器和任务添加 添加一个名为sanyou-xxljob-demo执行器 任务添加 执行器选择我们刚刚添加的指定任务名称为TestJobcorn表达式的意思是每秒执行一次 创建完之后需要启动一下任务默认是关闭状态也就不会执行 创建执行器和任务其实就是CRUD并没有复杂的业务逻辑 按照如上配置的整个Demo的意思就是 每隔1s执行一次sanyou-xxljob-demo这个执行器中的TestJob任务 3、创建执行器和任务 引入依赖 dependenciesdependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactIdversion2.2.5.RELEASE/version/dependencydependencygroupIdcom.xuxueli/groupIdartifactIdxxl-job-core/artifactIdversion2.4.0/version/dependency /dependencies配置XxlJobSpringExecutor这个Bean Configuration public class XxlJobConfiguration {Beanpublic XxlJobSpringExecutor xxlJobExecutor() {XxlJobSpringExecutor xxlJobSpringExecutor  new XxlJobSpringExecutor();//设置调用中心的连接地址xxlJobSpringExecutor.setAdminAddresses(http://localhost:8080/xxl-job-admin);//设置执行器的名称xxlJobSpringExecutor.setAppname(sanyou-xxljob-demo);//设置一个端口后面会讲作用xxlJobSpringExecutor.setPort(9999);//这个token是保证访问安全的默认是这个当然可以自定义// 但需要保证调度中心配置的xxl.job.accessToken属性跟这个token是一样的xxlJobSpringExecutor.setAccessToken(default_token);//任务执行日志存放的目录xxlJobSpringExecutor.setLogPath(./);return xxlJobSpringExecutor;}}XxlJobSpringExecutor这个类的作用后面会着重讲 通过XxlJob指定一个名为TestJob的任务这个任务名需要跟前面页面配置的对应上 Component public class TestJob {private static final Logger logger  LoggerFactory.getLogger(TestJob.class);XxlJob(TestJob)public void testJob() {logger.info(TestJob任务执行了。。。);}} 所以如果顺利的话每隔1s钟就会打印一句TestJob任务执行了。。。 启动项目注意修改一下端口因为调用中心默认也是8080本地起会端口冲突 最终执行结果如下符合预期 讲完概念和使用部分接下来就来好好讲一讲Xxl-Job核心的实现原理 从执行器启动说起 前面Demo中使用到了一个很重要的一个类 XxlJobSpringExecutor 这个类就是整个执行器启动的入口 这个类实现了SmartInitializingSingleton接口 所以经过Bean的生命周期一定会调用afterSingletonsInstantiated这个方法的实现 这个方法干了很多初始化的事这里我挑三个重要的讲其余的等到具体的功能的时候再提 1、初始化JobHandler JobHandler是个什么 所谓的JobHandler其实就是一个定时任务的封装 一个定时任务会对应一个JobHandler对象 当执行器执行任务的时候就会调用JobHandler的execute方法 JobHandler有三种实现 MethodJobHandlerGlueJobHandlerScriptJobHandler MethodJobHandler是通过反射来调用方法执行任务 所以MethodJobHandler的任务的实现就是一个方法刚好我们demo中的例子任务其实就是一个方法 所以Demo中的任务最终被封装成一个MethodJobHandler GlueJobHandler比较有意思它支持动态修改任务执行的代码 当你在创建任务的时候需要指定运行模式为GLUE(Java) 之后需要在操作按钮点击GLUE IDE编写Java代码 代码必须得实现IJobHandler接口之后任务执行的时候就会执行execute方法的实现 如果你需要修改任务的逻辑只需要重新编辑即可不需要重启服务 ScriptJobHandler通过名字也可以看出是专门处理一些脚本的 运行模式除了BEAN和GLUE(Java)之外其余都是脚本模式 而本节的主旨所谓的初始化JobHandler就是指执行器启动的时候会去Spring容器中找到加了XxlJob注解的Bean 解析注解然后封装成一个MethodJobHandler对象最终存到XxlJobSpringExecutor成员变量的一个本地的Map缓存中 缓存key就是任务的名字 至于GlueJobHandler和ScriptJobHandler都是任务触发时才会创建 除了上面这几种你也自己实现JobHandler手动注册到JobHandler的缓存中也是可以通过调度中心触发的 2、创建一个Http服务器 除了初始化JobHandler之外执行器还会创建一个Http服务器 这个服务器端口号就是通过XxlJobSpringExecutor配置的端口demo中就是设置的是9999底层是基于Netty实现的 这个Http服务端会接收来自调度中心的请求 当执行器接收到调度中心的请求时会把请求交给ExecutorBizImpl来处理 这个类非常重要所有调度中心的请求都是这里处理的 ExecutorBizImpl实现了ExecutorBiz接口 当你翻源码的时候会发现ExecutorBiz还有一个ExecutorBizClient实现 ExecutorBizClient的实现就是发送http请求所以这个实现类是在调度中心使用的用来访问执行器提供的http接口 3、注册到调度中心 当执行器启动的时候会启动一个注册线程这个线程会往调度中心注册当前执行器的信息包括两部分数据 执行器的名字也就是设置的appname执行器所在机器的ip和端口这样调度中心就可以访问到这个执行器提供的Http接口 前面提到每个服务实例都会对应一个执行器实例所以调用中心会保存每个执行器实例的地址 这里你可以把调度中心的功能类比成注册中心 任务触发原理 弄明白执行器启动时干了哪些事接下来讲一讲Xxl-Job最最核心的功能那就是任务触发的原理 任务触发原理我会分下面5个小点来讲解 任务如何触发快慢线程池的异步触发任务优化如何选择执行器实例执行器如何去执行任务任务执行结果的回调 1、任务如何触发 调度中心在启动的时候会开启一个线程这个线程的作用就是来计算任务触发时机这里我把这个线程称为调度线程 这个调度线程会去查询xxl_job_info这张表 这张表存了任务的一些基本信息和任务下一次执行的时间 调度线程会去查询下一次执行的时间 当前时间 5s的任务 这个5s是XxlJob写死的被称为预读时间提前读出来保证任务能准时触发 举个例子假设当前时间是2023-11-29 08:00:10这里的查询就会查出下一次任务执行时间在2023-11-29 08:00:15之前执行的任务 查询到任务之后调度线程会去将这些任务根据执行时间划分为三个部分 当前时间已经超过任务下一次执行时间5s以上也就是需要在2023-11-29 08:00:05不包括05s之前的执行的任务当前时间已经超过任务下一次执行时间但是但不足5s也就是在2023-11-29 08:00:05和2023-11-29 08:00:10不包括10s之间执行的任务还未到触发时间但是一定是5s内就会触发执行的 对于第一部分的已经超过5s以上时间的任务会根据任务配置的调度过期策略来选择要不要执行 调度过期策略就两种就是字面意思 直接忽略这个已经过期的任务立马执行一次这个过期的任务 对于第二部分的超时时间在5s以内的任务就直接立马执行一次之后如果判断任务下一次执行时间就在5s内会直接放到一个时间轮里面等待下一次触发执行 对于第三部分任务由于还没到执行时间所以不会立马执行也是直接放到时间轮里面等待触发执行 当这批任务处理完成之后不论是前面是什么情况调度线程都会去重新计算每个任务的下一次触发时间然后更新xxl_job_info这张表的下一次执行时间 到此一次调度的计算就算完成了 之后调度线程还会继续重复上面的步骤查任务调度任务更新任务下次执行时间一直死循环下去这就实现了任务到了执行时间就会触发的功能 这里在任务触发的时候还有一个很有意思的细节 由于调度中心可以是集群的形式每个调度中心实例都有调度线程那么如何保证任务在同一时间只会被其中的一个调度中心触发一次 我猜你第一时间肯定想到分布式锁但是怎么加呢 XxlJob实现就比较有意思了它是基于八股文中常说的通过数据库来实现的分布式锁的 在调度之前调度线程会尝试执行下面这句sql 就是这个sql select * from xxl_job_lock where lock_name schedule_lock for update 一旦执行成功说明当前调度中心成功抢到了锁接下来就可以执行调度任务了 当调度任务执行完之后再去关闭连接从而释放锁 由于每次执行之前都需要去获取锁这样就保证在调度中心集群中同时只有一个调度中心执行调度任务 2、快慢线程池的异步触发任务优化 当任务达到了触发条件并不是由调度线程直接去触发执行器的任务执行 调度线程会将这个触发的任务交给线程池去执行 所以上图中的最后一部分触发任务执行其实是线程池异步去执行的 那么为什么要使用线程池异步呢 主要是因为触发任务需要通过Http接口调用具体的执行器实例去触发任务 这一过程必然会耗费时间如果调度线程去做就会耽误调度的效率 所以就通过异步线程去做调度线程只负责判断任务是否需要执行 并且Xxl-Job为了进一步优化任务的触发将这个触发任务执行的线程池划分成快线程池和慢线程池两个线程池 在调用执行器的Http接口触发任务执行的时候Xxl-Job会去记录每个任务的触发所耗费的时间 注意并不是任务执行时间只是整个Http请求耗时时间这是因为执行器执行任务是异步执行的所以整个时间不包括任务执行时间这个后面会详细说 当任务一次触发的时间超过500ms那么这个任务的慢次数就会加1 如果这个任务一分钟内触发的慢次数超过10次接下来就会将触发任务交给慢线程池去执行 所以快慢线程池就是避免那种频繁触发并且每次触发时间还很长的任务阻塞其它任务的触发的情况发生 3、如何选择执行器实例 上一节说到当任务需要触发的时候调度中心会向执行器发送Http请求执行器去执行具体的任务 那么问题来了 由于一个执行器会有很多实例那么应该向哪个实例请求 这其实就跟任务配置时设置的路由策略有关了 从图上可以看出xxljob支持多种路由策略 除了分片广播其余的具体的算法实现都是通过ExecutorRouter的实现类来实现的 这里简单讲一讲各种算法的原理有兴趣的小伙伴可以去看看内部的实现细节 第一个、最后一个、轮询、随机都很简单没什么好说的 一致性Hash讲起来比较复杂你可以先看看这篇文章再去查看Xxl-Job的代码实现 zhuanlan.zhihu.com/p/470368641 最不经常使用LFULeast Frequently UsedXxl-Job内部会有一个缓存统计每个任务每个地址的使用次数每次都选择使用次数最少的地址这个缓存每隔24小时重置一次 最近最久未使用LRULeast Recently Used将地址存到LinkedHashMap中它利用LinkedHashMap可以根据元素访问get/put顺序来给元素排序的特性快速找到最近最久未使用未访问的节点 故障转移调度中心都会去请求每个执行器只要能接收到响应说明执行器正常那么任务就会交给这个执行器去执行 忙碌转移调度中心也会去请求每个执行器判断执行器是不是正在执行当前需要执行的任务任务执行时间过长导致上一次任务还没执行完下一次又触发了如果在执行说明忙碌不能用否则就可以用 分片广播XxlJob给每个执行器分配一个编号从0开始递增然后向所有执行器触发任务告诉每个执行器自己的编号和总共执行器的数据 我们可以通过XxlJobHelper#getShardIndex获取到编号XxlJobHelper#getShardTotal获取到执行器的总数据量 分片广播就是将任务量分散到各个执行器每个执行器只执行一部分任务加快任务的处理 举个例子比如你现在需要处理30w条数据有3个执行器此时使用分片广播那么此时可将任务分成3分每份10w条数据执行器根据自己的编号选择对应的那份10w数据处理 当选择好了具体的执行器实例之后调用中心就会携带一些触发的参数发送Http请求触发任务 4、执行器如何去执行任务 相信你一定记得我前面在说执行器启动是会创建一个Http服务器的时候提到这么一句 当执行器接收到调度中心的请求时会把请求交给ExecutorBizImpl来处理 所以前面提到的故障转移和忙碌转移请求执行器进行判断最终执行器也是交给ExecutorBizImpl处理的 执行器处理触发请求是这个ExecutorBizImpl的run方法实现的 当执行器接收到请求在正常情况下执行器会去为这个任务创建一个单独的线程这个线程被称为JobThread 每个任务在触发的时候都有单独的线程去执行保证不同的任务执行互不影响 之后任务并不是直接交给线程处理的而是直接放到一个内存队列中线程直接从队列中获取任务 这里我相信你一定有个疑惑 为什么不直接处理而是交给队列从队列中获取任务呢 那就得讲讲不正常的情况了 如果调度中心选择的执行器实例正在处理定时任务那么此时该怎么处理呢** 这时就跟阻塞处理策略有关了 阻塞处理策略总共有三种 单机串行丢弃后续调度覆盖之前调度 单机串行的实现就是将任务放到队列中由于队列是先进先出的所以就实现串行这也是为什么放在队列的原因 丢弃调度的实现就是执行器什么事都不用干就可以了自然而然任务就丢了 覆盖之前调度的实现就很暴力了他是直接重新创建一个JobThread来执行任务并且尝试打断之前的正在处理任务的JobThread丢弃之前队列中的任务 打断是通过Thread#interrupt方法实现的所以正在处理的任务还是有可能继续运行并不是说一打断正在运行的任务就终止了 这里需要注意的一点就是阻塞处理策略是对于单个执行器上的任务来生效的不同执行器实例上的同一个任务是互不影响的 比如说有一个任务有两个执行器A和B路由策略是轮询 任务第一次触发的时候选择了执行器实例A由于任务执行时间长任务第二次触发的时候执行器的路由到了B此时A的任务还在执行但是B感知不到A的任务在执行所以此时B就直接执行了任务 所以此时你配置的什么阻塞处理策略就没什么用了 如果业务中需要保证定时任务同一时间只有一个能运行需要把任务路由到同一个执行器上比如路由策略就选择第一个 5、任务执行结果的回调 当任务处理完成之后执行器会将任务执行的结果发送给调度中心 如上图所示这整个过程也是异步化的 JobThread会将任务执行的结果发送到一个内存队列中执行器启动的时候会开启一个处发送任务执行结果的线程TriggerCallbackThread这个线程会不停地从队列中获取所有的执行结果将执行结果批量发送给调度中心调用中心接收到请求时会根据执行的结果修改这次任务的执行状态和进行一些后续的事比如失败了是否需要重试是否有子任务需要触发等等 到此一次任务的就算真正处理完成了

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/90774.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网站的建设教程新手搭建网站教程视频

在上一篇文章中,通过演练指导的方式,介绍了在Docker中运行ASP.NET Core Web API应用程序的过程。本文将介绍Docker for Windows的使用。 先决条件 前两周时间,Docker发布了Docker for Windows的正式版,于是就可以在Windows下运行D…

网站开发费用wordpress 短码

在PyTorch、Keras、OpenCV、NumPy和PIL这几个框架中,它们在表示图像时的维度存储顺序有所不同。下面我将逐一解释每个框架中图像维度的存储顺序: 1,PyTorch: PyTorch中图像的维度顺序通常遵循 [N, C, H, W] 的格式,也就是channe…

php儿童摄影网站源码品牌塑造

一、前言 作为计算机视觉技术解决方案提供商——灵卡(LingCard)公司推出的新一代超群性能采集卡—— LCC262,以其卓越的性能表现和丰富多样的功能特性,为广大用户带来了前所未有的视频和音频处理体验。本文旨在对该产品进行详细解…

兰州程序开发网站建设福州关键词排名优化

有时由于eclipse异常关闭,当我们重启Eclipse,在启动项目时,会报错,说:ClassNotFound类似的错误,引起这种问题的原因可能是由于,Eclipse异常关闭引起的。 解决:在一个项目中&#xff…

桐乡微网站建设公司ppt做视频的模板下载网站有哪些内容

4 HBase 摘要:HBase是一种非关系型数据库,它是基于谷歌BigTable的开源实现,和BigTable一样,支持大规模海量数据的存储,对于分布式并发数据处理的效率极高,易于扩展且支持动态伸缩,适用于廉价设备…

网站做二级域名东莞松山湖

Java 集合的 Set 接口Set类型与List类型的区别Set: 无序、不可重复List: 有序、可重复1、HashSetHashSet的存储结构:HashMap特点:HashSet通过比较存放的哈希码(hashCode)来确定对象存放的位置当两个对象的哈希值相等时&#xff0c…

志愿服务网站建设中标公告门户网站开发专业

一. 进程基本概念: 1.进程: 程序:存放在外存中的一段数据组成的文件 进程:是一个程序动态执行的过程,包括进程的创建、进程的调度、进程的消亡 2.进程相关命令: 1.top 动态查看当前系统中的所有进程信息(根据CPU占用率排序)…

个人如何制作一个网站网站建设制作宝塔面板

全世界只有3.14 % 的人关注了数据与算法之美爱因斯坦曾说过“要是乱糟糟的桌面意味着杂乱无章的脑袋,那空白桌面意味着什么呢?似乎很多在某些领域拥有天赋的人都不喜欢干净整洁的桌面,包括乔布斯和扎克伯格也是,甚至有的人一看到整…

网站ueowordpress自动生成二维码

计算机技术在当今的社会,已经变得越来越热,充斥着我们生活的方方面面。人们的工作或是休闲,离不开互联网和电脑,这既受益于各类软件的诞生,也与时下的技术息息相关。Java作为编程界赫赫有名的语言,在最近几…

十大最坑装修公司排名东莞seo搜索

索引的本质 MySQL官方对索引的定义为:索引(Index)是帮助MySQL高效获取数据的数据结构。提取句子主干,就可以得到索引的本质:索引是数据结构。 我们知道,数据库查询是数据库的最主要功能之一。我们都希望查询…

重庆做网站优化推广的公司邢台做网站公司排名

搜狗浏览器是一款日常经常会使用的浏览服务软件,用户可以使用手机获取自己想要的浏览内容,各种浏览操作都可以快速掌握,但是使用浏览器的时候会出现各种动作提示,这样会方便用户的操作,这种动作操作设置以后&#xff0…

160 国际英文网站宝塔面板wordpress静态化

24年软考又要来了,作为高项软考的拦路虎,论文你准备好了吗?!记住在开始考试之前一定要用论文答题纸上把准备好的论文,在规定的时间内写上几遍,一是现在很少动笔写字了。二是、熟悉一下论文考试的感觉。 准备…

网站续费多少钱wordpress显示所有文章列表

linux多线程自己从接触很久也有不少实践,但总是觉得理解不够深刻,不够系统。借这篇文章试着再次系统学习一下linux多线程编程,理解编程的concept,细致看一下POSIX pthread API的实现。还是凭借强大的google search,找到…

网站301检测有什么网站是学做吃的

1.原因分析 后端没接收到uid可能是前端没传递uid也可能是前端传递了uid,但是传递方式与后端接收方式不匹配,导致没接收到更大的可能是因为后端请求方式错了。比如: 2.解决方案 先确定前端传参方式与后端请求方式是匹配的后端get请求的话…

企业网站需要多少费用美篇制作app下载官网免费

题目 有一个大小是N * M的战场地图,被墙壁’#‘分隔成大小不同的区域,上下左右四个方向相邻的空地∵,属于同一个区域,只有空地上可能存在敌人’E’,请求出地图上总共有多少区域里的敌人数小于K。 输入描述 第一行输入为…

网站备案注销找哪个部门软件商店打不开怎么办

java学习 一.io流 简介:io,i代表in,指的是输入,o代表输出。io流是用于处理输入和输出数据的机制。Java的io流主要分为字节流和字符流两种类型。这些流可以用于读取和写入不同类型的数据,如文本,图片&#…

济南做网站 推荐行知科技2022年网络流行语

1、一个人经历了所有的苦难,也不要指望能和谁在一起;我曾经真诚的尝试过,但是结果我不想说。2、只要你愿意,只要我有,整个世界都是你的,而你只能是我的。3、只要你愿意,当你失落失意的时候&…

哪个网站买域名便宜深圳制作网站制作公司

官方扩容指导文档 PVE给虚拟机磁盘扩容 给虚拟机磁盘扩容,选中OpenWRT的硬盘,随后选择调整大小 输入增量大小,即增加多少磁盘空间给硬盘。这里我选择增加4G 进入OpenWRT控制台界面安装一些linux常用查看磁盘的工具(也可以通过网…

微信推广时间关键词优化怎么弄

1、MySQL卸载: (通过yum命令卸载之前安装的mysql, find命令找到mysql文件,再用rm –rf 强制删除/var/lib/mysql) 2、MySQL安装: (使用yum命令安装mysql,安装完成后启动数据库&#x…

黑色炫酷的监控网站html郑州网站建设平台

MSR015/MSR025 是低温漂、低功耗、高精度 CMOS 电压基准, 具有 0.05% 初始精度、低功耗特点。该器件的低输出电压迟滞和低长期输出电压 漂移特性,进一步提高稳定性和系统可靠性。 此外,器件的小尺寸和低运行 电流特性使其非常适合便携…