Java内部具有原子更新的动态热交换环境

有人可能会说上述标题可以简称为OSGi ,我想在一开始就放弃这种思考过程。

对于OSGi而言,这不是一个冒犯,这是一个很棒的规范,在实现层或可用性层上都弄得一团糟,这就是我对OSGi的信念。 当然,您可以使用OSGi进行此操作,但同时还要进行一些自定义工作。 使用OSGi解决此问题的缺点是在开发过程中引入了不必要的复杂性。 我们受到了JRebel的启发,并且想了一会儿,我们想要并很快意识到那条线上的东西,我们不想在生产级运行时进行字节码注入。 因此让我们分析问题领域。

问题域

我们要解决的问题与UltraESB有关 ,具体来说就是实时更新功能 。 UltraESB支持以原子方式向正在运行的ESB更新/添加新的配置片段(称为“ 部署单元 ”),而不会造成停机时间,最重要的是不会出现任何不一致的状态。 但是,此功能的局限性之一是,如果特定的Java类驻留在用户类空间中,则需要对此部署单元的配置更新进行更改,因此需要重新启动JVM。 尽管在集群部署中(使用循环重启)可以承受,但是在单实例部署中,这给整个系统带来了停机时间。

我们必须确保在解决这一问题时几乎没有任何保证;

  • 在更新部署单元时,该单元已经接受的消息应使用所有资源,包括现有单元的已加载类(以及要加载的任何新类),而任何新消息(在完成单元更新后)都必须使用被调度到新的部署单元配置和资源库,我们称之为“ 一致性保证 ”。
  • 为了确保这一点,我们需要在同一JVM上管理同一类的2个(或更多个)相同类的版本,以使各个部署单元以原子方式使用这些类。 让我们称其为部署单元的“ 原子性保证 ”。
  • 部署单元配置可能包含Java片段,这些Java片段在更新时进行即时编译,其中可能包含对更新后的类的依赖关系,从而使编译器能够找到该类的新版本以进行编译过程。 这就是“ 正确性保证
  • 更新过程必须对用户透明(他们不必担心这一点,无论是在开发时间上还是在部署时间上),并且整个过程应该很简单。 让我们称之为“ 简单性保证

现在您将理解这个问题不仅仅是OSGi,因为编译是至少在我撰写此博客时OSGi无法自行解决的问题(AFAIK)。

如果我回到OSGi,以确保它非常清晰,为什么我们不走这条路呢?让我们详细分析需求。 我们真正想要的不是完全模块化的JVM,而是JVM内部可动态且原子可重新加载的特定空间。 将其映射到我们的实际用例中, 可以确保用户写入并插入ESB的任何内容(即包含代理服务,序列和中介逻辑的部署单元)都可以动态地自动重新加载,可版本化,但不能像在ESB核心中执行用户代码 。 这是用户向我们询问的内容,而不是您如何在不重新启动的情况下如何在运行时向ESB添加其他功能。 我同意能够添加新功能很酷,但是似乎没有人希望这样做以及与之相关的复杂性。 我们已经准备好进行任何复杂的工作,但是还没有准备好将这种复杂性或任何复杂性传递给我们的用户。

拟议的解决方案

如果您想在Java中使用前2个保证“ Consistency / Atomicity ”(能够在运行时加载同一个类的2个版本,并在其中的正确任务中使用正确的类),则除了编写之外,别无他法一个新的类加载器,它强制JVM执行子优先级加载 。 JVM标准类装入器都是“父优先”的。 典型应用程序容器的WebAppClassLoader与我们想要的非常接近,但是在生产环境中具有动态重载功能。 旧类空间和新类空间应由该类加载器的2个实例管理,以便能够安全地隔离这2个版本。

要了解上述事实,重要的是要了解JVM如何识别类。 即使从Java语言的角度来看,类也是由FQN唯一标识的,即FQN,即“包名+类名”,但是从JVM的角度来看,除了上述概念外,已经加载了该类的类加载器也是一个事实班级的独特性。 在类似OSGi的环境中,这就是为什么即使您强制转换为正确的类型也看到ClassCastException的原因。 因此得出的结论是,我们需要编写一个类加载器,并为可重新加载的不同部署单元的不同版本保留该类加载器的单独实例。

为了确保即时编译器看到正确的类来编译序列片段,从而保证“ 正确性 ”,需要有一个JavaFileManager实现,再次寻找更新的类空间。 Java编译器任务javac通过指定的文件管理器(作为JavaFileObject实例)而不是通过类加载器(作为类对象)来搜索依赖项以编译类,这是为了确保编译器有效地解析类,因为可能存在依赖项在正在编译的类中。

此外,不应该要求用户将jar文件放在经过版本控制的文件结构中,以免影响对“ 简单性 ”的保证,而ESB本身必须管理该jar文件的版本控制以确保我们不会混合使用不同的版本类空间。 这对于在不同版本中正确执行编译器任务也很重要,因为编译器使用“ 内存映射”文件读取文件管理器提供的类的输入流上的类定义,从而强制维护每个文件的物理副本。 jar文件/类的版本。

执行执行

首先让我指出完整的变更集 ,在阅读实现时可以不时参考。

我们已经确定了3个要实现的关键空间,其中第一个是提供用户类空间的类的类加载器。 我们将其命名为HotSwapClassLoader (我不会在博客中向您显示代码片段,请记住该完整代码,请牢记AGPL许可的条款,因为该代码为AGPL )。 现在,我们想将此类加载器与部署单元的版本相关联,UltraESB固有地支持该版本加载器,因为它将它们保持为单独的Spring子上下文。

因此,任何新的部署单元配置创建(包括现有部署单元的新版本)都将实例化此类加载器的新实例,并将其用作部署单元配置的资源/类加载器。 初始化时的类加载器计算用户类空间的规范化哈希值,并检查当前版本的类空间是否存在现有副本,并根据上述声明使用该副本或创建新副本。 这种散列和重用类空间的现有副本会阻止管理同一用户类空间版本的2个副本,因为整个过程都是在静态最终锁上同步的。 然后,它对用户类空间的该副本进行操作。 必须进行此复制,以免让用户担心类的版本控制,并确保在给定的配置中使用了正确的类集。 该类装入器还采取了广泛的措施,以确保尽早清除类空间副本。 但是,这只能保证最终清除。

执行的下一个主要项目是InMemoryFileManager哪个是哪个得到改性通过列表的方法的一个可迭代以支持另外的用户类的空间来在内存中的编译源代码片段现有类SwappableJavaFileObject实例。 文件管理器首先查询HotSwapClassLoader,以查找与用户类空间相对应的SwappableJavaFileObject实例,然后是系统类空间,并以WrappedIterator的形式返回,以确保用户空间类获得优先级。

在实现的最后一步中,对核心JVM功能进行了调整/自定义之后,只需使用此自定义类加载器来加载序列和代理服务的类,并为片段编译任务提供自定义文件管理器即可。部署单元以完成解决方案。 我们还希望有一个开关在默认情况下将其禁用,并建议在生产部署中将其禁用。 为了简化运行时环境并进行其他一些自定义,UltraESB引入了环境概念,该概念是从Grails环境功能中借用的。

最后,成功实现了动态运行时,即“一致”,“原子”,“正确”,最重要的是“对用户简单”。

操作行为

现在,我们已经实现了解决方案,让我们看一下UltraESB的内部结构,了解它在生产部署中如何工作。 发出配置添加或更新管理命令后,将更新生产环境中的所有部署单元配置。 可以通过原始JMX或通过在JMX操作之上实现的任何管理工具(例如UTerm )或通过UConsole发出此命令。

完成此实现后,它不会对您进行更新的方式进行任何更改,它通过添加/替换jar文件的功能进一步增强了功能,并进行了修改,从而将更新影响到UltraESB的lib / custom用户类空间中,从而确保了在更新后发出每个所述管理命令后,为新配置选择更新的jar文件/类。
您可以在UltraESB的夜间版本中尝试此操作,甚至可以等待2.0.0版本的发布,该版本计划在2013年1月中旬发布更多新的酷但可用的功能。

参考: Java内部的动态热交换环境 ,我们的JCG合作伙伴 Ruwan Linton在
Blind Vision –来自软件工程与生活博客。

翻译自: https://www.javacodegeeks.com/2012/12/dynamic-hot-swap-environment-inside-java-with-atomic-updates.html

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

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

相关文章

Css Secret 案例Demo全套

Css Secret 案例全套 github地址 案例地址 去年买了一本CSS揭秘的css专题书,该书揭示了 47 个鲜为人知的 CSS 技巧,主要内容包括背景与边框、形状、 视觉效果、字体排印、用户体验、结构与布局、过渡与动画等。去年买入时,就决定将里面所有…

底量超顶量超级大黑马指标源码_底量超顶量+地量买点_月线底量超顶量大牛股,底量超顶量超级大黑马,底量超顶量买入指标,后量超前量买入指标_指标公式分享交流论坛_理想论坛 - 股票论坛...

l 图形特征:(1) 当股价从头部滑落一段时间后,会有一个见底回升的过程。(2) 这个头部区间的成交量称为顶量,见底回升时的成交量称为底量。(3) 如果底量能大大地超过顶量,则较容易通过顶量造成的压力带。…

php var_export与var_dump 输出的不同

问题发现在跟踪yratings_get_targets的时候,error_log(var_export(yblog_mspconfiginit("ratings"),true));老是打印出yblog_mspconfiginit(“ratings”)的返回是NULL 导致我以为是无法建立和DB的连接,走错路了一天。最后才发现,这…

Servlet 开发

1. Servlet (很久远的东西,但是现在学习原理) html css js 前端页面(静态的) form action ".html" Servlet 允许将action属性设置为映射,通过映射找到相关的Servlet class 进行数据的处理。…

JAX-RS Bean验证错误消息国际化

Bean验证简介 JavaBeans验证(Bean验证)是一种新的验证模型,可作为Java EE 6平台的一部分使用。 约束条件支持Bean验证模型,该约束以注释的形式出现在JavaBeans组件(例如托管Bean)的字段,方法或类…

CentOS 7 Flannel的安装与配置

1. 安装前的准备 etcd 3.2.9 Docker 17.12.0-ce 三台机器10.100.97.236, 10.100.97.92, 10.100.97.81 etcd不同版本之间的差别还是挺大的,使用V3版本跟Flannel整合起来会有坑,下文详解。 2. 安装 sudo yum install -y flannel 安装后,版本是0…

给Ambari集群里安装基于Hive的大数据实时分析查询引擎工具Impala步骤(图文详解)...

不多说,直接上干货! Impala和Hive的关系(详解) 扩展博客 给Clouderamanager集群里安装基于Hive的大数据实时分析查询引擎工具Impala步骤(图文详解) 参考 hortonworks ambari集成impala ambari hdp 集成 imp…

python调用ffmpeg合并_用ffmpeg命令处理mp4剪切与合并

1. 剪切:./ffmpeg -ss 00:00:06 -t 00:00:12 -i input.mp4 -vcodec copy -acodec copy output.mp4意思是从截取从6秒开始,时长为12秒的视频,格式不变,输入为input.mp4输出为output.mp4-vcodec copy -acodec copy : 编码格式不变2.…

html中常见的小问题(1)

问题&#xff1a;自适应高度的块级元素内添加图片后&#xff0c;其高度会比图片高度多出一块 简单代码如下&#xff1a; <!doctype html> <html><head><style>.box{width:533px;margin:100px auto;border:1px solid red;}</style></head>…

Java程序员的10个XML面试问答

XML面试问题在各种编程工作面试中非常受欢迎&#xff0c;包括针对Web开发人员的Java面试 。 XML是一项成熟的技术&#xff0c;通常用作从一个平台传输数据的标准。 XML面试问题包含来自各种XML技术的问题&#xff0c;例如XSLT&#xff0c;该技术用于转换XML文件&#xff0c; XP…

[转] Java, 使用 Reactor 进行反应式编程

https://www.ibm.com/developerworks/cn/java/j-cn-with-reactor-response-encode/index.html?lnkhmhm转载于:https://www.cnblogs.com/pekkle/p/8311749.html

JmeterAnt构建自动化测试平台

一、jmeter jmeter下载地址为&#xff1a;http://jmeter.apache.org/download_jmeter.cgi 下载完成后&#xff0c;解压文件&#xff0c; 加压后&#xff0c;到biin目录下&#xff0c;点击jmeter.bat启动jmeter(如果是linux环境&#xff0c;给jmeter.sh可执行的权限&#xff0c;…

input复选框checkbox默认样式纯css修改

修改之前的样式 修改之后的样式 html <input type"checkbox" name"btn" id"btn1"><label for"btn1">按钮1</label> css input[type"checkbox"]{width:20px;height:20px;display: inline-block;text-al…

c++word书签_「职场必备」干货!WORD办公软件快捷键,小编整理拿走不谢

小编工作时的照片&#xff0c;不上镜CtrlShiftSpacebar创建不间断空格Ctrl -(连字符)创建不间断连字符CtrlB使字符变为粗体CtrlI使字符变为斜体CtrlU为字符添加下划线CtrlShift缩小字号CtrlShift>增大字号CtrlQ删除段落格式CtrlSpacebar删除字符格式CtrlC复制所选文本或对象…

struts.xml 配置

1.ActionSupport是默认的Action类,若某个action节点没有配置class属性&#xff0c;则ActionSupport即为待执行的Action类 2.在手工完成字段验证&#xff0c;显示错误消息&#xff0c;国际化等情况下&#xff0c;推荐继承ActionSupport 3.result是action节点的子节点&#xff0c…

前端学习---css基本知识

css基本知识 我们先看一个小例子&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title> </head> <body><div style"background-color:#2459a2;height:…

mysql 从库_mysql数据库主从配置

在一篇文章《离线安装mysql数据库》,讲解了离线安装mysql数据库的过程&#xff0c;本文将讲解mysql数据库的主从配置方法。mysql数据库进行主从配置后&#xff0c;可以实现数据库的备份、同时应用也可以实现读写分离&#xff0c;提高应用的并发量。1、主从原理从《高性能mysql》…

Java内联虚拟方法调用的性能

总览 动态编译的好处之一是&#xff0c;它能够支持在虚拟方法代码上进行广泛的方法内联。 虽然内联代码可以提高性能&#xff0c;但是代码仍然必须检查类型&#xff08;以防由于优化而更改了类型&#xff09;或在多个可能的实现之间进行选择。 这导致了问题。 通过接口调用的…

.Net Core 部署到 CentOS7 64 位系统中的步骤

建议使用 root 管理员账户操作 1、安装工具 1、apache 2、.Net Core(dotnet-sdk-2.0) 3、Supervisor(进程管理工具&#xff0c;目的是服务器一开机就启动服务器 上发布的ASP.NET Core Web网站) 2、安装apache 在安装apache之前&#xff0c;要先做一件事就是&#xff0c;把当前登…

【模板小程序】 十进制大数相乘(正数、负数、0均可),包含合法性检查

1 /*2 本程序说明&#xff1a;3 4 大数乘法(模拟乘法操作&#xff0c;取其中一个字符串&#xff0c;每一位分别相乘&#xff0c;最后移位加起来)5 6 时间复杂度&#xff1a;O(k1*k2),k1和k2分别为两字符串长度7 空间复杂度&#xff1a;O(1)8 9 */10 11 #include <iostream&g…