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

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

java原子更新类

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

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

相关文章

5个构建Spring Boot API的实用技巧

建筑物身份管理,包括身份验证和授权? 尝试Stormpath! 我们的REST API和强大的Java SDK支持可以消除您的安全风险,并且可以在几分钟内实现。 注册 ,再也不会建立auth了! 每个API开发人员都在寻找一种更安全…

C++项目目录组织结构

项目目录结构的问题基本上是个仁者见仁,智者见智的问题,只要自己用着顺手,使用什么样的目录组织结构是没有什么大碍的。当然如果项目很大,参与的人员很多,那么合理的组织一下目录结构还是会有很大的益处的。不同类型的…

火绒杀毒软件更安静

https://www.huorong.cn/转载于:https://www.cnblogs.com/Tom-yi/p/10554564.html

完全编译安装boost

文章目录 1. 安装依赖2. 编译安装 boost3. 环境变量配置 boost是C世界中相当优秀的第三方库,被选入STL的也有不少,其中用到的C奇技淫巧更是数不胜数。 安装依赖 boost 在类 Unix 系统上的安装,可以参考官方文档的 Get Started,除此…

c#Md5 32位加密结果少了两个0的原因

我们的: e1adc3949ba59abbe56e57f20f883e 第三方的:e10adc3949ba59abbe56e057f20f883e 原因: 这个是很常见的错误,你字节转换成字符串的时候要保证是2位宽度啊,某个字节为0转换成字符串的时候必须是00的,否则就会丢失…

lambdas for_Wordcounter,使用Lambdas和Fork / Join计算Java中的单词数

lambdas for这些天来,我发布了Wordcounter ,这是一个Java库和命令行实用程序,用于对文本文件中的单词进行计数并对单词计数进行分析,从而大量使用了功能编程结构和并行计算方法。 这是我在“令人讨厌的快速问答”大赛第四个条目SA…

Bitmap Font生成

工具:AngelCode 的 Bitmap Font Generator。把需要用到的文字写到一个txt,注意编码为Unicode。接着,在工具里 Edit->select chars from file选择刚才新建的txt文件。然后。。。之后的没啥细节,随意搞吧。转载于:https://www.cn…

分隔和截断字符串, boost string algorithm library中的split和trim

http://www.boost.org/doc/libs/1_46_1/doc/html/string_algo.html 这个库是个 headers only library  这个库提供了STL没有提供的 string-related算法, 但是实现做到了可以用在任何 character 的 container上 split 在写在线状态的改造时候要把一个字符串中描述的几种类型拆…

使用Spring Integration重试RabbitMQ

我最近阅读了有关使用RabbitMQ重试的方法 在这里,并想尝试类似的方法 Spring Integration ,提供了一组很棒的集成抽象。 TL; DR解决的问题是重试一次消息(在处理失败的情况下),两次重试之间有较大的延迟&#xff08…

Vue_(Router路由)-vue-router路由的基本用法

vue-router官网:传送门 vue-router起步:传送门 vue-router路由:Vue.js官网推出的路由管理器,方便的构建单页应用 单页应用:Single Page Application简称SPA,只有一个web页面的应用,用户与应用交…

利用boost做string到wstring转换,以及字符集转换

#include <boost/locale.hpp> int _tmain(int argc, _TCHAR* argv[]) {//std::locale::global(std::locale("utf-8"));std::locale::global(std::locale("")); // 设置全局的C运行库locale 可以针对cout fstream等单独设置 空表示默认使用当前系统…

P4198 楼房重建

[Luogu4198] 原题解 19.3.21 用线段树维护有关单调栈的问题 不要pushdown , 但是pushup的时候需要特别注意. 19.3.31 这里的\(pushup2\)其实就是几个特判 : 没有 , 直接返回当前区间答案 , 区间长度为\(1\) , 以及剩下两大类 , 这里有一个模板 : if(mx[ls]<tmp) return push…

Linux多线程实践(1) --线程理论

线程概念 在一个程序里的一个执行路线就叫做线程&#xff08;thread&#xff09;。更准确的定义是&#xff1a;线程是“一个进程内部的控制序列/指令序列”; 一切进程至少有一个执行线程; 进程 VS. 线程 1.进程是资源分配(进程需要参与资源的竞争)的基本单位,而线程是处理器调…

蓝桥杯 密文搜索(全排列)

题目描述福尔摩斯从X星收到一份资料&#xff0c;全部是小写字母组成。他的助手提供了另一份资料&#xff1a;许多长度为8的密码列表。福尔摩斯发现&#xff0c;这些密码是被打乱后隐藏在先前那份资料中的。请你编写一个程序&#xff0c;从第一份资料中搜索可能隐藏密码的位置。…

openshift_为Openshift + MongoDb应用程序编写验收测试

openshift验收测试用于确定是否满足规范要求。 它应在与生产环境尽可能相似的环境中运行。 因此&#xff0c;如果您的应用程序已部署到Openshift中&#xff0c;则您将需要一个与生产环境中使用的帐户平行的帐户&#xff0c;以运行测试。 在这篇文章中&#xff0c;我们将为部署到…

学 Win32 汇编[28] - 跳转指令: JMP、JECXZ、JA、JB、JG、JL、JE、JZ、JS、JC、JO、JP 等

跳转指令分三类:一、无条件跳转: JMP;二、根据 CX、ECX 寄存器的值跳转: JCXZ(CX 为 0 则跳转)、JECXZ(ECX 为 0 则跳转);三、根据 EFLAGS 寄存器的标志位跳转, 这个太多了.根据标志位跳转的指令: JE ;等于则跳转 JNE ;不等于则跳转JZ ;为 0 则跳转 JNZ ;不为 0 则跳转JS…

广告行业一些常用物料的尺寸

10-13 14:13 设计 /淘宝 海报 50cm 70cm &#xff08;宽 高&#xff09; 57cm 84cm &#xff08;宽 高&#xff09; 横幅 横幅尺寸高度默认为整10为单位&#xff0c;50、60、70、长度视环境而定&#xff0c;材料一般为牛津布&#xff0c;旗帜布&#xff0c;颜色有双色有彩…

Spring Security和自定义密码编码

在上一篇文章中&#xff0c;我们使用jdbc和md5密码编码将密码编码添加到了我们的spring安全配置中。 但是&#xff0c;在定制UserDetailsS​​ervices的情况下&#xff0c;我们需要对安全配置进行一些调整。 我们需要创建一个DaoAuthenticationProvider bean&#xff0c;并将…

智能变电站协议系列-2、SV/SMV协议示例(IEC61850)以及5G专网下的电力方案分析

文章目录 一、前言二、资料准备三、libiec61850的SV运行示例及抓包分析1、单独编译示例程序2、运行示例程序及5G专网场景下部署3、wireshark抓包分析 四、最后 一、前言 之前我们对IEC61850协议有了整体的了解&#xff0c;对一些概念有了一定的认识&#xff0c;并针对GOOSE协议…

php 常用的知识点归集(下)

24、静态属性与静态方法在类中的使用 需求&#xff1a;在玩CS的时候不停有伙伴加入&#xff0c;那么现在想知道共有多少人在玩&#xff0c;这个时候就可能用静态变量的方法来处理 利用原有的全局变量的方法来解决以上的问题 <?php header(content-type:text/html;charsetut…