xxljob客户端架构流程
一、xxl-job的调度流程和配置
任务调度器和执行器使用http协议通信,各自有轮询线程处理不同业务。
二、XXL-JOB客户端启动流程加载Bean: 从spring容器获取所有对象,并遍历查找方法上标记XxlJob注解的方法 将xxljob配置的jobname作为key,对象Handle作为value注册Map 中 ConcurrentMap jobHandlerRepository的Map中维护; 创建执行任务的线程池; 启动内嵌的Netty服务; 启动注册线程,每隔30s上报一次注册信息。
public class EmbedServer { public void start(final String address, final int port, final String appname, final String accessToken) { executorBiz = new ExecutorBizImpl(); thread = new Thread(new Runnable() { @Override public void run() { // param EventLoopGroup bossGroup = new NioEventLoopGroup(); EventLoopGroup workerGroup = new NioEventLoopGroup(); ThreadPoolExecutor bizThreadPool = new ThreadPoolExecutor( 0, 200, 60L, TimeUnit.SECONDS, new LinkedBlockingQueue(2000)); // start server ServerBootstrap bootstrap = new ServerBootstrap(); bootstrap.group(bossGroup, workerGroup) .channel(NioServerSocketChannel.class) .childHandler(new ChannelInitializer() { @Override public void initChannel(SocketChannel channel) throws Exception { channel.pipeline() .addLast(new IdleStateHandler(0, 0, 30 * 3, TimeUnit.SECONDS)) // beat 3N, close if idle .addLast(new HttpServerCodec()) .addLast(new HttpObjectAggregator(5 * 1024 * 1024)) // merge request & reponse to FULL .addLast(new EmbedHttpServerHandler(executorBiz, accessToken, bizThreadPool)); } }).childOption(ChannelOption.SO_KEEPALIVE, true); ChannelFuture future = bootstrap.bind(port).sync(); // start registry startRegistry(appname, address); // wait util stop future.channel().closeFuture().sync(); } }); thread.setDaemon(true); // daemon, service jvm, user thread leave >>> daemon leave >>> jvm leave thread.start(); } }三、任务的下发与执行
任务的下发与执行(服务端发送给客户端):
收到服务器不动执行进行任务分发:
private Object process(HttpMethod httpMethod, String uri, String requestData, String accessTokenReq) { switch (uri) { case "/beat": return executorBiz.beat(); case "/idleBeat": IdleBeatParam idleBeatParam = GsonTool.fromJson(requestData, IdleBeatParam.class); return executorBiz.idleBeat(idleBeatParam); case "/run": TriggerParam triggerParam = GsonTool.fromJson(requestData, TriggerParam.class); return executorBiz.run(triggerParam); case "/kill": KillParam killParam = GsonTool.fromJson(requestData, KillParam.class); return executorBiz.kill(killParam); case "/log": LogParam logParam = GsonTool.fromJson(requestData, LogParam.class); return executorBiz.log(logParam); default: return new ReturnT(ReturnT.FAIL_CODE, "invalid request, uri-mapping(" + uri + ") not found."); } }1 /beat:心跳保活检测
直接return success,用户服务器探活; 2 /idleBeat:任务执行策略配置为忙碌转移时使用;
等待队列如果存在待执行任务时,返回false;
等待队列为空时:返回true; 3 /run:接收到执行任务指令
将任务提交到执行队列中,并返回true;
队列满或handler不存在时返回false; 4 /kill:中断任务
对执行任务的线程执行 JobThread.interrupt();
每个任务Id会有一个线程,Kill仅杀死执行该任务Id的线程,下次再下发任务发现线程已中断会重新创建线程。 5 /log:获取执行log
返回客户端执行的本地log给服务端。 四、客户端注册和执行结果上报
客户端注册和执行结果上报(客户端发送给服务端)
@Override public ReturnT callback(List callbackParamList) { return XxlJobRemotingUtil.postBody(addressUrl+"api/callback", accessToken, timeout, callbackParamList, String.class); } @Override public ReturnT registry(RegistryParam registryParam) { return XxlJobRemotingUtil.postBody(addressUrl + "api/registry", accessToken, timeout, registryParam, String.class); } @Override public ReturnT registryRemove(RegistryParam registryParam) { return XxlJobRemotingUtil.postBody(addressUrl + "api/registryRemove", accessToken, timeout, registryParam, String.class); }1 /registry:注册客户端信息
启动线程定时注册自己的服务到调度器;
创建线程,30s轮询一次,上报注册信息。 2 /registryRemove:移出执行器请求
将自己从执行器列表移除;
程序退出时会调用一次,在Netty的finally代码块自动执行。 3 /callback:异步回调结果
执行器异步回调给调度器执行任务结果;
每次任务完成时上报。 五、附录1 网络通信格式:
(1)客户端注册
http://127.0.0.1:8080/xxl-job-admin/api/registry { "registryGroup": "EXECUTOR" "registryKey": "xxl-job-executor-sample" "registryValue": "http://172.30.0.67:9999/" } Response: { "code": 200 "msg": null "content": null }
(2)客户端移除注册
http://127.0.0.1:8080/xxl-job-admin/api/registryRemove { "registryGroup": "EXECUTOR" "registryKey": "xxl-job-executor-sample" "registryValue": "http://xxljob-axzo.cn" } Response: { "code": 200 "msg": null "content": null }
(3)客户端执行任务结果上报
http://127.0.0.1:8080/xxl-job-admin/api/callback { "logId": 1238 "logDateTim": 1667197980007 "handleCode": 200 } Response: { "code": 200 "msg": null "content": null }
(4)执行器下发任务:同步回调仅代表任务是否发送成功
http://172.30.0.67:9999/run { "jobId": 4 "executorHandler": "demoJobHandler" "executorParams": "" "executorBlockStrategy": "SERIAL_EXECUTION" "executorTimeout": 0 "logId": 1238 "logDateTime": 1667197980007 "glueType": "BEAN" "glueSource": "" "glueUpdatetime": 1666683613000 "broadcastIndex": 0 "broadcastTotal": 1 } Response: { "code": 200 "msg": null "content": null }2 Token配置详解
1.配置了token后,client发送的每隔http请求头会带上XXL-JOB-ACCESS-TOKEN :{xxl.job.accessToken} ;
2.该参数不会对请求参数加密;
3.如果配置不匹配,客户端请求报错:
{ "code": 500 "msg": "The access token is wrong." "content": null }
4.发送配置token的请求,Header中新增了Token参数
5.配置错token的返回
程序员的核心竞争力其实还是技术,因此对技术还是要不断的学习, 关注 "IT巅峰技术" 公众号 ,该公众号内容定位:中高级开发、架构师、中层管理人员等中高端岗位服务的,除了技术交流外还有很多架构思想和实战案例。
作者是 《 消息中间件 RocketMQ 技术内幕》 一书作者,同时也是 "RocketMQ 上海社区"联合创始人,曾就职于拼多多、德邦等公司,现任上市快递公司架构负责人,主要负责开发框架的搭建、中间件相关技术的二次开发和运维管理、混合云及基础服务平台的建设。
李少莉事件官媒发文曝光李少莉事件在最近引发了众多网友的热烈谈论,这次谈论的焦点是她在一次发布会上穿戴奢侈,并用手指点着稿念,所以让网友们对她产生了质疑,觉得她生活奢侈,工作能力很差。在这件事情上,网上的
网友们认定李少莉已经没事,会不会有不一样的结果呢爱美是女人的天性,但是美丽也分时间和地点,呼和浩特的一场防疫新闻发布会,带火了一位精致漂亮的女干部,她就是李少莉,呼和浩特市审批局副局长,在会上她妆容精致,服饰华贵,因为佩戴疑似三
就整个禅宗历史而言,其根本性智慧主要凝聚在慧能的坛经之中就整个禅宗历史而言,其根本性的智慧主要凝聚在慧能的坛经之中。坛经在历史上有众多版本。但其中最早的版本为敦煌本,最流传的版本为宗宝本。宗宝本显然不是慧能一人的言说,而是禅宗历史上众多
德媒俄乌冲突或将欧洲经济推向深渊由于乌克兰战争影响,明年欧洲经济的前景继续暗淡不明。据德国新闻电视频道网站11月11日报道,欧盟委员会将其对2023年欧盟和欧元区的经济增长预期大幅下调至0。3。今年夏季对欧盟和欧
把你的破伞收起来,让批评你的雨水顺着你的脖子从后面流下去在现实生活中,我们难免会遇到一些情绪化的家伙,他们对我们做一些毫不负责的批评责难,说着尖酸刻薄的语言,令我们懊恼忧虑烦躁不安。面对这些事,你们应该怎么做呢?让自己愤怒暴躁歇斯底里吗
赵构为什么不北伐?因为不符合他的利益靖康耻,犹未雪,臣子恨,何时灭。岳飞满江红写怀岳飞剧照01赵构的幸运1127年,金军攻破北宋都城汴京,将徽钦二帝俘虏北去。一同被俘的,还有皇族后宫妃嫔朝臣等三千余人。徽宗一脉仅剩康
顶流归来,植物园这场盛宴,错过等一年文沈慧雯图吴夏璠说到最能代表秋天的花,桂和菊花必然首当其冲。桂花的香气早已一波又一波弥漫杭城,那菊花该去哪里寻呢?那自然是杭州植物园啦!最近,大家期盼已久的秋日菊花大展两宋菊花精品
看了袁安碑才明白三国前期袁绍扛大旗为何一呼百应前段时间有幸认识一位专门研究拓片的老师,粗浅知晓了袁安和袁安碑的故事。不接触不知道,原来拓片背后的世界如此博大精深。后汉书中有关于袁安传的记载,今天的主题就围绕袁安展开。94年前的
明日白露,无论贫富,三白三果要多吃,清热润燥,舒服度秋明日白露,无论贫富,三白三果要多吃,清热润燥,舒服度秋。俗话说一场秋雨一场凉,一场白露一场霜。明日是白露节气,是一年当中昼夜温差特别大的节气。白露到了,此时天气渐凉,除了要注意及时
引导美APP系统开发平台搭建(源码软件H5)在互联网的时代,上门服务作为这一经济形态的延伸物,逐渐形成一种热潮。如今,上门服务的品类越来越多,互联网巨头的涌入让这一市场变成了服务业变革的新趋势。在这种势态下,上门美容自然成为
Linux系统安装Nacos1nacos安装部署1。1使用derby(Nacos内置数据库)1。1。1版本选择统一使用nacos1。4。1版本,下载地址httpsgithub。comalibabanacosr
半场0梅州客家直播吧6月20日讯北京时间6月20日17点30分,2022赛季中超第一阶段第5轮成都蓉城迎战梅州客家。上半场,双方互有攻守但均无建树。半场战罢,成都蓉城00梅州客家!本场比赛开赛前
梦华录花魁这件事暴露了你脆弱的内心最近,刘亦菲和陈晓主演的电视剧梦华录热播,在古偶界掀起一波空前的浪潮。梦华录改编自关汉卿原著赵盼儿风月救风尘,讲述了妓女宋引章因受蒙骗嫁给恶少周舍后,其拜把姐妹赵盼儿智斗恶少,最终
泰韩惊悚片灵媒有望出续集大家还记得去年在韩国新加坡泰国等多地上映的泰韩合拍惊悚片灵媒吗?当时这部电影上映初便获得了巨大的反响,尤其是在韩国影视界,其票房超1。99亿泰铢。据最新消息,灵媒制片罗泓轸导演在S
面临众叛亲离,普京的话值得揣摩俄罗斯总统普京深陷对乌克兰战争漩涡的克里姆林宫主人不再像往年那样能够自信地面对本国民众,因此取消了近期的一场国内最高规格的例行的领袖与平民的对话活动,但仍然兴致勃勃地举办了彼得堡国
不带充电宝不敢出门?续航焦虑这一尴尬局面,已被真我打破2021年,在一项更换手机你更看重哪些方面的市场调研中,可以看出中国手机用户最在意手机的哪些方面。排名第一的是性能,高达66。5,说明手机性能依然是人们最追求的底层逻辑其次,排名第
我29岁,男,事发时就在那个烧烤店6月10日凌晨,在唐山市路北区机场路的烧烤店发生了一起恶性伤人事件,经网络发酵后引发全民声讨。海森(化名)今年29岁,案发时,他和朋友们在烧烤店外用餐。根据通话记录,他在当晚2点4
那些屡屡创业失利,仍未跌落悬崖的人里,为什么总有新东方背景?在后来的某个时间点,无一例外,三位老师的理想都落空了。他们的命运在新东方里短暂交错后分野,又宿命般地在悬崖边相遇。尝过绝望的企业家们最后都默契地爬起无论是锤子科技还是K12教育,当
新东方董宇辉否认直播有文案张口就来的小作文,取决于读过的书6月20日消息,新东方的董宇辉近日直播爆火后,有网友质疑是否有专业团队为其代写文案。对此,董宇辉在接受央视采访时回应称,张口就来的小作文,那么简单的文案,不需要提前准备。每个老师在
2005年,湖南一农民拿出八路军借他420块的借条,如今能还多少?自古常言到杀人抵命,欠债还钱,乃是天经地义之事。相信这句话大家都有所耳闻,人与人之间的借贷关系,从古至今一直都有,其中虽然也有一些欠债不还的小人,但是绝大多数欠款,通过合理的法律途
江苏学霸笔记惊艳曝光!字迹工整,逻辑硬核!网友这是高手笔记,在每个人的学习生涯里都是不可或缺的存在,它记录着学子笔耕不辍的收获学习知识的感悟每一堂课的进步。行云流水的文字,栩栩如生的图画,逻辑严密的框架当灵感流淌在笔尖时,知识同时也内
三胎何时能形成战斗力?搭载什么飞机?国内外描述有不同长图头号周刊(文章中分享003型福建的航母高清模拟长图)三胎003型福建号航母下水以后,万众瞩目。国内国外媒体纷纷报道,迅速登上热搜,登上了各大媒体的头版头条!正常情况下航母下水一后,