PowerJob容器的今生,容器是如何部署到Worker上,并正常运行的

news/2024/4/25 9:41:27/文章来源:https://blog.csdn.net/z449077880/article/details/129154763

这仅仅是一篇PowerJob源码分析的文章,但是也有一些java基础知识,在实践中学习效果更好,感兴趣就留下来交流一下吧。

上回书说到,这个powerjob容器是如何生成模板,如何上传到服务器上去,本回主要总结的是,worker是如何部署执行容器的。其实我在寻找部署的入口的时候,还是费了一番功夫的,因为这个部署按钮,他居然不在containerController里面,而是在另外一个类里面,害我一顿好找,差一点就放弃了。

一切的开始:容器的部署

这个部署的入口,居然使用的是websocket,在server.web.websocket包下的ContainerDeployServerEndpoint类中,当你点击前台页面中某个容器的部署按钮时,就会触发该类下面的onOpen方法,调用ContainerService的deploy方法。

调用deploy方法之后,前面已经讲过,会向worker的WorkerActor发送一条命令,让其对容器进行部署,当然worker是一个列表。

WorkerActor接到命令之后,操作的步骤如下:

1. 判断是否是重复部署

Long containerId = request.getContainerId();
String containerName = request.getContainerName();
String version = request.getVersion();OmsContainer oldContainer = CARGO.get(containerId);
if (oldContainer != null && version.equals(oldContainer.getVersion())) {return;
}

2. 如果不是重复部署,创建容器jar包

String filePath = CONTAINER_DIR + containerId + "/" + version + ".jar";
File jarFile = new File(filePath);

3.判断jar包文件是否存在,如果不存在,则从server端下载jar包

if (!jarFile.exists()) {FileUtils.forceMkdirParent(jarFile);FileUtils.copyURLToFile(new URL(request.getDownloadURL()), jarFile, 5000, 300000);log.info("[OmsContainer-{}] download jar successfully, path={}", containerId, jarFile.getPath());
}

 4.创建新容器

OmsContainer newContainer = new OmsJarContainer(containerId, containerName, version, jarFile);
newContainer.init();

初始化里面,需要自定义一个类加载器

public class OhMyClassLoader extends URLClassLoader

通过解析下载jar包中的配置文件“oms-worker-container.properties”获取jar包的路径,通过路径和自定义的类加载器的合作,将容器的类进行一个动态加载

// 解析 Properties
Properties properties = new Properties();
try (InputStream propertiesURLStream = containerClassLoader.getResourceAsStream(ContainerConstant.CONTAINER_PROPERTIES_FILE_NAME)) {if (propertiesURLStream == null) {log.error("[OmsJarContainer-{}] can't find {} in jar {}.", containerId, ContainerConstant.CONTAINER_PROPERTIES_FILE_NAME, localJarFile.getPath());throw new PowerJobException("invalid jar file because of no " + ContainerConstant.CONTAINER_PROPERTIES_FILE_NAME);}properties.load(propertiesURLStream);log.info("[OmsJarContainer-{}] load container properties successfully: {}", containerId, properties);
}
String packageName = properties.getProperty(ContainerConstant.CONTAINER_PACKAGE_NAME_KEY);
if (StringUtils.isEmpty(packageName)) {log.error("[OmsJarContainer-{}] get package name failed, developer should't modify the properties file!", containerId);throw new PowerJobException("invalid jar file");
}// 加载用户类
containerClassLoader.load(packageName);

通过spring的IOC容器将类进行加载

ClassLoader oldCL = Thread.currentThread().getContextClassLoader();
Thread.currentThread().setContextClassLoader(containerClassLoader);
try {this.container = new ClassPathXmlApplicationContext(new String[]{ContainerConstant.SPRING_CONTEXT_FILE_NAME}, false);this.container.setClassLoader(containerClassLoader);this.container.refresh();
}finally {Thread.currentThread().setContextClassLoader(oldCL);
}

5.  将新的容器保存在内存中

CARGO.put(containerId, newContainer);

6. 将旧的容器销毁

if (oldContainer != null) {// 销毁旧容器oldContainer.destroy();
}

到这里,容器的部署就算是结束了。

平淡无奇:容器的执行

讲过本篇文章和上一篇文章,在经历了容器模板的生成下载,容器的开发与上传,容器的部署之后,容器就可以正常使用了,这个时候就需要在任务管理里面添加任务了!

 

需要将执行配置添加好,容器ID#加全限定名,添加好了之后,点击运行,进入任务实例界面查看运行结果!

 

总结

 至此,容器的前世今生就全部结束了,不知道看完了这些之后,你是否会有所收获,我最大的收获就是,当我的某个流程或者系统需要新增功能时,完全可以用到这里面的思想,不过这个东西不宜过多使用,否则会因为添加的容器过多,而不好管理。

 

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

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

相关文章

【踩坑指南】Stable Diffusion 服务器端部署笔记

文章目录下载github文件配置环境ckpt文件权重下载生成图像NSFW检查(瑟图过滤)下载github文件 https://github.com/CompVis/stable-diffusion 这个网址,下载压缩包解压,也可以用git clone下载 配置环境 这一步坑最多&#xff0c…

day32 多线程(上)

文章目录相关概念codeThreadTest01ThreadTest02 编写一个类,直接继承java.lang.Thread,重写run方法ThreadTest03 实现线程的第二种方法ThreadTest04 采用匿名内部类的方式ThreadTest05 获取线程名字ThreadTest06 sleep方法sleep面试题ThreadTest08 终止线…

游戏专用蓝牙耳机哪个牌子好?最好的游戏蓝牙耳机品牌排行

近年来,随着越来越多手机取消3.5mm耳机孔,真无线耳机也逐渐流行起来,随着国内的手机品牌越来越多,真无线耳机的品类逐渐增多,面向游戏用户的游戏模式也出现了,下面我们来看看以下几款游戏专用的蓝牙耳机。 …

10 种主数据模型设计示例分享,推荐收藏

主数据模型是主数据管理的基础,一个完整的、可扩展的、相对稳定的主数据模型对于主数据管理的成功起着重要的作用。规划、创建主数据模型的过程,是梳理主数据管理体系的过程,目的是建立一个良好的资源目录结构,划分合理的资源粒度…

Leetcode力扣秋招刷题路-0088

从0开始的秋招刷题路,记录下所刷每道题的题解,帮助自己回顾总结 88. 合并两个有序数组 给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目。 请你 合并 nums2 …

我说我为什么抽不到SSR,原来是这段代码在作祟...

本文是龚国玮所写,熊哥有所新增修改删减,原文见文末。 我说我为什么抽不到SSR,原来是加权随机算法在作祟 阅读本文需要做好心理准备,建议带着深究到底的决心和毅力进行学习! 灵魂拷问 为什么有 50% 的几率获得金币&a…

同一局域网的不同主机使用共享文件夹通信(仅限于不同Windows主机之间的通信)

1、新建共享文件夹 我们新建一个文件夹 Server-Share,右键点击“ 属性 ” 选择“everyone”,即允许当前局域网下的所有用户访问这个共享文件夹 此时该文件夹面向当前局域网是公开的。 2、服务器访问共享文件夹 (1) 查看当前电脑的IP IP地址可以唯一标…

企业为什么需要数据可视化报表

数据可视化报表是在商业环境、市场环境已经改变之后,发展出来为当前企业提供替代解决办法的重要方案。而且信息化、数字化时代,很多企业已经进行了初步的信息化建设,沉淀了大量业务数据,这些数据作为企业的资产,是需要…

园区数字化转型必不可少的助推器:快鲸智慧园区系统

数字化浪潮下,园区数字化转型已成必然趋势。可大多数人在讨论智慧园区的时候,更多聚焦在技术上,却忽略了一个关键点,就是打造智慧园区最终的结果导向是提高业务信息化水平,进而达到集约高效、提质增效、节能降耗的可持…

干货复试详细教程——从联系导师→自我介绍的复试教程

文章目录联系导师联系之前的准备联系导师注意自我介绍教育技术领域通用的复试准备其他补充联系导师 确定出分和自己能进复试以后联系。 分两类 科研技能型 低调,如实介绍,不吹不水。就算你很牛啥都会手握核心期刊论文也不太狂 学霸高分型 不要自卑&…

STM32-CAN配置与库函数解析,实现环回模式通信

STM32-CAN配置与库函数解析 CAN总线介绍:https://blog.csdn.net/weixin_46251230/article/details/129147612 STM32-CAN控制器介绍:https://blog.csdn.net/weixin_46251230/article/details/129150872 STM32CubeMx配置 因为bxCAN是挂载在APB1总线上的…

【学习总结】相机与IMU标定一:Kalibr论文

论文:2013IROS论文,Unified Temporal and Spatial Calibration for Multi-Sensor Systems,是Kalibr工具的参考论文之一。介绍了如何进行IMU与相机标定。 参考的一篇资料:知乎:超全汇总!多传感器离线/在线时…

新建微服务模块Maven子工程

gitegg-cloud是微服务框架,整体功能是非业务相关的基础功能,在实际业务开发过程中需要新建微服务的业务模块,根据业务的整体规划,设计新建Maven子工程。   下面以常用的电商项目举例新建Maven子工程,电商项目一般包含…

VIIRS-NPP夜间灯光遥感数据下载和预处理

VIIRS-NPP夜间灯光遥感数据下载和预处理 月和年合成产品下载网站 日数据下载网站 一、下载shp掩膜文件 下载好月合成产品后,在这个网站上下载矢量地图, 点击复制按钮,来到这个网站,ctrl v粘贴 点击右上角Export,…

搞懂事件——C# 的event的机制深度理解

📢欢迎点赞 :👍 收藏 ⭐留言 📝 如有错误敬请指正,赐人玫瑰,手留余香!📢本文作者:由webmote 原创📢作者格言:无尽的折腾后,终于又回到了起点,工控,我来了 !1. 前言 为什么忽然对Event感兴趣了? 因为进入Web时代以后,很少使用它了,忽然想起这个知识点,…

九龙证券|市场化转融资业务试点上线首日平稳运行

2月21日,中国证券金融股份有限公司(下称“中证金融”)商场化转融资事务试点迎来首个买卖日。全天该事务试点平稳运转,商场化转融资规模合计10亿元。 业内人士以为,商场化转融资事务形式下,证券公司参加转融…

使用51单片机和DS1302时钟芯片做一个简易的电子时钟

简易的电子时钟实验一、前言二、DS1302模块介绍三、驱动DS1302的代码3.1 初始化DS1302时钟芯片3.2 读取DS1302时钟芯片的时间3.3 设置DS1302时钟芯片的时间3.4 读取DS1302时钟芯片的RAM四、读取DS1302时钟芯片的RAM4.1 发送读取RAM的命令4.2 读取RAM的内容4.3 读取部分单独代码…

[飞桨paddle]1. conda安装paddle环境.模型转换,pytorch->paddlepaddle

“一生费城七六人”1. conda装paddle环境1.1 验证是否装好2. x2paddle2.1 介绍2.2 安装3 模型转换3.1 pt -> onnx3.2 onnx > .pdparams3.2.1 会出现的错误情况3-1. 第一种情况3-2. 第二种情况4. 查看结果问题阐述:将yoloV5项目移至paddle框架下执行时&#xf…

中央一号文件首提“即时零售”,县域掀起消费业态新风潮

经过几年的探索,即时零售已经逐步走向成熟,并开始向三四线城市以及乡镇城市渗透。 过去一年,京东、美团、阿里争先布局即时零售市场,完善即时配送网络、培养用户消费习惯,即时零售订单迎来了骤增。2022年下半年&#…

C/C++每日一练(20230222)

目录 1. 部分复制字符串(★) 2. 按字典顺序排列问题(★★) 3. 地下城游戏(★★★) 附录 动态规划 1. 部分复制字符串 将字符串2小写字母复制到字符串1:编写程序,输入字符串s2,将其中所有小写字母复制到字符串数组strl中。例如:aal1bb22cc33de4AA55…