应用程序服务器迁移:从JBoss EE5到Wildfly EE7

几周前,我发布了一个有关从Java EE 5迁移到7的博客 。这主要是关于如何使用新的Java EE 7改进Java EE 5代码。 现在,在本文中,我将对应用程序服务器端的迁移路径进行一些研究。

如果您使用的是Java EE 5,则很有可能正在使用以下服务器之一:

  • JBoss 4倍或5倍
  • 玻璃鱼 2x
  • Weblogic 10倍
  • Websphere 7倍

还有许多其他支持Java EE 5的服务器,您可以在此处检出它们。

序幕

我最终获得了我在JBoss 4x上的大部分经验,因为当时我正在工作的公司已经在他们的大多数项目中大量使用了它。 我对此事几乎没有任何表决权,只是与JBoss保持公司的发展方向。

当我们决定将我们的一个客户端关键应用程序从Java EE 5迁移到7时,我们面临着使用哪个应用程序服务器的难题。 自从我担任技术管理职务以来,我现在能够影响这一决定。 由于以下原因,我们最终选择了Wildfly :

  • 已实现Java EE 7完整配置文件
  • 强大的CLI管理服务器
  • 团队已经熟悉Wildfly随附的Java EE实现

即使本文讨论了JBoss和Wildfly ,但某些原则仍然适用于Application Server。 因此,我希望这对其他Application Server用户也有用。 当前,我们正在使用Wildfly 8.2.0,但本文中讨论的内容也应与最新的Wildfly版本一起使用。

战略

执行Application Server迁移,尤其是涉及服务器之间相距甚远的迁移,绝非易事。 迁移路径并不十分简单,因为每个应用程序最终都会使用Application Server的不同功能。 更糟糕的是,该应用程序甚至可能正在实现这些功能所支持的业务代码,而这些功能可能在目标迁移服务器中不可用。

无论如何,在进行迁移项目时可以遵循两种策略:

功能冻结

顾名思义,您将冻结项目以执行必要的调整以迁移应用程序。 处理复杂性可能更容易,但另一方面,它会延迟业务功能并创建不可协商的期限。 要说服利益相关者采用这种策略是非常困难的,但是如果您有能力,那就去做。

组合式

另一个选择是保持开发持续进行并同时进行迁移。 这对企业来说是最好的,但是需要更多的纪律和计划。 您始终可以将应用程序分区并将其拆分为模块,然后少量迁移。 这是我通常使用的策略。

第一步

您可能需要一些时间才能完全迁移您的应用程序。 在此期间,您需要保持旧服务器以及新服务器的运行。 为此,您需要更新和复制环境。 就像分支代码一样,但是在运行时。

您使用的支持工具可能也需要更新。 新服务器的Maven插件,即Jenkins部署,无论与Application Server进行交互。 这是一项艰巨的任务,因为管理所有这些额外环境和分支的复杂性并不容易。

走的路

考虑迁移时,您需要担心几个细节。 这不是一个详尽的列表,但可能是您将会遇到的最常见的主题。

类加载

如果您没有遇到ClassNotFoundExceptionNoClassDefFoundErrorClassCastException您可能要考虑玩彩票并中奖!

对于JBoss 4.x Classloader尤其如此。 当时,类加载是(仍然是,但甚至超过)一项昂贵的操作,因此JBoss使用了一种称为UnifiedClassLoader东西。 这意味着应用程序之间没有真正的隔离。 EAR档案可能会相互查看以加载库。 当然,这是要管理的主要难题。 最糟糕的部分是当您必须使用JBoss服务器将应用程序部署到客户中时。 如果您无法控制它,则当前部署可能与您自己的部署发生冲突。

Wildfly引入了基于模块的类加载,而不是通常的分层方法。 通常,除非使用文件描述符明确声明,否则部署在Wildfly中的应用程序将无权访问Application Server库。 对于Java EE应用程序,这些模块会自动加载。

更换服务器时,以下是与类加载相关的最常见问题:

  • 坐在其他应用程序上的缺少库。
  • 在服务器上已删除或更新的库上进行中继。
  • 应用程序上使用的库现在是新服务器的一部分。

要解决此问题,您需要通过添加删除必需的库来调整项目依赖项。 这里没有分步指南。 每种情况都需要进行分析并相应解决。 这有点像试图解开一个满是结的弦。

如果您使用的是Dependency Plugin ,那么您可以使用mvn dependency:treemvn dependency:analyze来帮助您。

Wildfly还为您提供了一个特定的描述符文件jboss-deployment-structure.xml ,通过添加或删除依赖项或更改类加载器的行为,您可以微调类的加载。 这是一个例子:

jboss部署结构

<?xml version="1.0" encoding="UTF-8"?>
<jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.2"><ear-subdeployments-isolated>false</ear-subdeployments-isolated><deployment><dependencies><module name="org.jboss.msc" export="true"/><module name="org.jboss.as.naming" export="true"/><module name="org.jboss.as.server" export="true"/><module name="deployment.app-client.jar" export="true"/><module name="deployment.app-ear.ear.app-entity.jar" export="true"/></dependencies></deployment>
</jboss-deployment-structure>

此自定义描述符正在添加来自其他部署的依赖关系,即app-client.jar ,甚至是app-ear.ear.app-entity.jar中另一个EAR的子部署。

最后,我的建议是尝试遵守标准,仅在绝对必要时才引入其他库。 这肯定会减少您的类加载问题,并使将来更轻松地迁移到服务器的新版本甚至更改为另一台服务器。

常规配置

在JBoss 4.x中,所有配置都分散在不同的文件中: server.xmljboss-service.xmllogin-config.xml以及许多其他文件。 您必须手动编辑文件才能更改所需的配置。 这是一项繁琐的工作,尤其是当您无权访问服务器并必须记录一组更改以供他人执行时。

在Wildfly中,大多数配置都进入configuration/standalone.xml ,但是我从未编辑过该文件。 Wildfly附带了非常强大的命令行界面(CLI),可让您编写几乎所有需要在服务器上执行的更改的脚本。 以下是Undertow配置的示例:

Underwow.cli

/subsystem=undertow/server=default-server/ajp-listener=ajp:add(socket-binding=ajp)/subsystem=undertow/server=default-server/host=app \:add( \alias=["localhost, ${app.host}"] \)/subsystem=undertow/server=default-server:write-attribute(name="default-host", value="app")/subsystem=undertow/server=default-server/host=app/filter-ref=server-header:add
/subsystem=undertow/server=default-server/host=app/filter-ref=x-powered-by-header:add
/subsystem=undertow/server=default-server/host=app/location="/":add (\handler=welcome-content)/subsystem=undertow/server=default-server/host=default-host/filter-ref=server-header:remove
/subsystem=undertow/server=default-server/host=default-host/filter-ref=x-powered-by-header:remove:reload/subsystem=undertow/server=default-server/host=default-host/location="/":remove/subsystem=undertow/server=default-server/host=default-host:remove/subsystem=undertow/server=default-server/host=segurnet/setting=single-sign-on:add(path="/"):reload

这将设置一个名为app的虚拟主机,使其成为默认主机,删除Wildfly随附的默认主机并激活Single Sign On。

使用脚本和CLI可以很容易地从头启动新服务器。 您应该始终喜欢这种更改服务器上配置的方法。

数据源

在JBoss 4.x中,设置数据源只需要您将数据库驱动程序复制到lib文件夹,并使用数据源连接详细信息创建*-ds.xml文件。

在Wildfly中 ,有些棘手,但没什么大不了的。 将数据源设置为模块,然后可以使用CLI将数据源连接详细信息添加到服务器配置中。 我甚至以前也写过一篇完整的博客文章: 使用Maven配置JBoss / Wildfly数据源 。

安全

JBoss 4.x中的安全性已在conf/login-config.xml 。 Wildfly并没有引入太多更改,但是如果您需要实现自定义登录模块,则依赖项会更改。 我还写了一篇完整的博客文章: Wildfly的Custom Principal和LoginModule 。

JNDI绑定

通常在JBoss 4.x中使用@LocalBinding为您的EJB定义确切的JNDI名称。 但是Java EE 7按作用域引入了标准JNDI名称,这意味着您应该遵循约定来查找EJB。

代替:

本地绑定

@Stateless
@Local(UserBusiness.class)
@LocalBinding(jndiBinding="custom/UserBusiness")
public class UserBusinessBean implements UserBusiness {}...private UserBusiness userBusiness;try {InitialContext context = new InitialContext();userBusiness = (UserBusiness) context.lookup("custom/userBusiness");
} catch(Exception e) {}

您可以:

EJB 3.1绑定

@EJB(lookup="java:global/app-name/app-service/UserBusinessBean")
private UserBusiness userBusiness;

当Wildfly启动时,您还可以在日志中检查标准绑定:

Wildfly JNDI标准绑定

java:global/segurnet/segurnet-protocol-gu-ejb/UserBusinessBean!com.criticalsoftware.segurnet.protocol.gu.ejb.business.UserBusinessjava:app/app-service/UserBusinessBean!com.app.business.UserBusinessjava:module/UserBusinessBean!com.app.business.UserBusinessjava:global/app-name/app-service/UserBusinessBeanjava:app/app-service/UserBusinessBeanjava:module/UserBusinessBean

其他的东西

这是我也写过博客文章的更具体的主题,可能也很有趣:

  • Spring Batch作为Wildfly模块
  • Wildfly,Apache CXF和@SchemaValidation

最后的话

如前所述,迁移永远不会遵循直接的路径。 不过,您可以做一些改进的事情。 编写测试,测试和测试。 我告诉过你要写测试吗? 在进行任何迁移工作之前,请先执行此操作。 即使迁移的一切看起来都很好,您也可能会在不同版本的Java EE实现之间遇到轻微的行为更改。

另外,不要小看这项工作。 使您的应用程序与正在开发的新功能保持一致,以及更改服务器,需要您花费时间和精力来确保一切都不会中断。 除非我们谈论的是非常小的应用程序,否则肯定不会花1周的时间。 我们花了将近2年的时间才能将应用程序迁移到100万行以上。 但是,请谨慎对待这些数字。 这些非常取决于您的团队动态。

我的最终建议:如果您使用的是旧版Java EE版本,则一定要迁移。 在我的博客中了解有关从Java EE 5降级到7的Legacy的信息 。 跳跃并非易事,但是随着Java EE发行版的每个新版本以及对标准化的关注,每次升级都将减轻痛苦。

翻译自: https://www.javacodegeeks.com/2015/11/application-server-migration-jboss-ee5-to-wildfly-ee7.html

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

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

相关文章

滑动窗口限流 java_Spring Boot 的接口限流算法优缺点深度分析

点击上方蓝色字体&#xff0c;选择“标星公众号”优质文章&#xff0c;第一时间送达上一篇&#xff1a;这300G的Java资料是我师傅当年给我的&#xff0c;免费分享给大家(已修复)下一篇&#xff1a;昨天分享资料不小心把百度网盘深处的秘密泄露了(已修复)转自: loubobooo原文&am…

php置顶文章,zblogphp调用置顶文章的教程

有客户建议&#xff0c;侧栏的热门推荐能不能调用置顶类型的文章&#xff0c;因为本站一直未置顶过文章&#xff0c;所以没考虑过这方面&#xff0c;但是既然有需要就得满足啊&#xff0c;是不&#xff1f;于是乎在网站查看教程&#xff0c;别说还真有一篇&#xff0c;信心博客…

通用网页调用本地应用程序方案(windows平台)

一、更新注册表 Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\receiveOutOfArg] "URL Protocol""D:\\LongHaibin\\Learn\\Net\\receiveOutOfArg\\receiveOutOfArg\\bin\\Debug\\receiveOutOfArg.exe" "applicationName" [HKEY_CLAS…

php7有没有使用jit,RegEx不适用于长模式PCRE的JIT编译器堆栈限制 – PHP7

PHP 7引入了PCRE的JIT编译器.它可以影响是否/如何在长输入上执行低效的正则表达式.Error 6 PREG_JIT_STACKLIMIT_ERROR重写正则表达式以提高效率,通常是通过删除无关的捕获组或更加小心量词.作为一种解决方法,您可以禁用JIT.所以你可以使用以下解决方案使其工作&#xff1a;in…

mips j指令_MIPS的基本实现

MIPS核心指令集&#xff1a;指令集概括为3个指令类&#xff1a;存储器访问指令类lw&#xff0c;sw等2. 算术逻辑指令类add&#xff0c;sub等3. 转移指令类beg&#xff0c;J等指令的共同性取指令&#xff0c;送PC值给Memory&#xff1b;根据指令内容读取寄存器内容&#xff1b;除…

腾讯管家去除桌面快捷小图标

找了大半天&#xff0c;原来腾讯管家也可以&#xff1a; 废话不多说&#xff0c;动手实践吧。。。。。 打开电脑管家——电脑诊所——桌面图标——【去掉快捷方式小箭头】 就这样轻松的实现了&#xff0c;赶快试试吧&#xff01; 转载于:https://www.cnblogs.com/yjq520/p/6858…

apache shiro_Apache Shiro第3部分–密码学

apache shiro除了保护网页和管理访问权限外&#xff0c; Apache Shiro还执行基本的加密任务。 该框架能够&#xff1a; 加密和解密数据&#xff0c; 哈希数据&#xff0c; 生成随机数。 Shiro没有实现任何加密算法。 所有计算都委托给Java密码学扩展&#xff08;JCE&#xf…

argparse模块_Argparse:一个具体案例教会你python命令行参数解析

问题描述&#xff1a;现有一个用于数据格式转换的py脚本(多转一)&#xff0c;执行时通过命令行传入一系列的参数控制其具体运行方式&#xff0c;使满足以下要求&#xff1a;1. 必须传入需要处理的原始数据文件名2. 可以指定输入文件的格式&#xff0c;若没有指定则使用默认值&a…

Eclipse中src/main/resources配置文件启动问题

项目pom文件有做修改如下的时候&#xff0c;还没有进行mvn clean install 启动test项目中的appcontext会 可以手动清空 然后就可以了。 出现如下问题的原因是 配置文件默认输出到target/classes 下 项目启动默认也会找该目录下的配置文件 其实这里pom文件拷贝配置文件只是用于读…

仍然不安全:变成了Java 9功能的Java 6中的主要错误

sun.misc.Unsafe的未来将如何发展&#xff1f; 随着2015年即将结束&#xff0c;我们认为这将是对Java社区过去一年中最热门辩论之一进行尸检的好机会。 通过查看标题&#xff0c;您中的大多数人可能已经开始在口腔中产生酸味并在肠道中产生愤怒的感觉&#xff0c;但是如果您错…

camvid数据集使用方法_使用PyTorch处理CIFAR10数据集并显示

在训练图像分类的时候&#xff0c;我们通常会使用CIFAR10数据集&#xff0c;今天就先写一下如何展示数据集的图片及预处理。第一部分代码&#xff0c;展示原始图像&#xff1a;import numpy as npimport torch#导入内置cifarfrom torchvision.datasets import cifar#预处理模块…

类型之间的相互转换php,php学习之数据类型之间的转换介绍

复制代码 代码如下:/*数据类型之间相互转换* 一种是强制转换* setType(变量,类型); //int,integer,float,double等等。* 这个函数将原变量的类型改变&#xff0c;用var_dump();可以查看变量** 在赋值前使用(类型)的形式,不会改变原变量的类型* $a(int)"123abc";** $变…

rhel 8.2不识别unicode_基于tensorflow 实现端到端的OCR:二代身份证号识别

最近在研究OCR识别相关的东西&#xff0c;最终目标是能识别身份证上的所有中文汉字数字&#xff0c;不过本文先设定一个小目标&#xff0c;先识别定长为18的身份证号&#xff0c;当然本文的思路也是可以复用来识别定长的验证码识别的。本文实现思路主要来源于Xlvector的博客&am…

Lua和C++交互详细总结

转载自&#xff1a;http://www.cnblogs.com/sevenyuan/p/4511808.html 一、Lua堆栈 要理解Lua和C交互&#xff0c;首先要理解Lua堆栈。 简单来说&#xff0c;Lua和C/C语言通信的主要方法是一个无处不在的虚拟栈。栈的特点是先进后出。 在Lua中&#xff0c;Lua堆栈就是一个struc…

php imagemagick 漏洞,ImageMagick漏洞(CVE-2016-3714)修复方案

关于这个漏洞影响ImageMagick6.9.3-9以前是所有版本&#xff0c;包括ubuntu源中安装的ImageMagick。而官方在6.9.3-9版本中对漏洞进行了不完全的修复。所以&#xff0c;我们不能仅通过更新ImageMagick的版本来杜绝这个漏洞。现在&#xff0c;我们可以通过如下两个方法来暂时规避…

adf开发_ADF BC:创建绑定到业务组件的UI表

adf开发在此示例中&#xff0c;我们将展示如何创建绑定到业务组件的简单UI表&#xff08;af&#xff1a;table&#xff09;。 我再次尝试使用简单的标准在网上进行搜索&#xff1a; “如何创建绑定到业务组件ADF 11g的af&#xff1a;table” 我必须承认我没有得到我想要的答案…

java游戏热血江湖,热血江湖源码_附安装教程

释放双眼&#xff0c;带上耳机&#xff0c;听听看~&#xff01;源码里面可能有联系方式之类的不要相信&#xff0c;反正我在这里已经说过了&#xff0c;你们上当就不管我的事了还有&#xff0c;源码里面的联系方式跟我没关系!教程来了认真看&#xff01;&#xff01;&#xff0…

cf 412A

http://codeforces.com/contest/806/problem/A 大意&#xff1a;已知分数x/y&#xff0c;给定p/q,问是否存在a,b使(pa)/(qab)x/y; 一开始用exgcd&#xff0c;算最优不好写&#xff0c;而且数据longlong范围直接炸了&#xff1b;看了一眼题解&#xff0c;居然能二分&#xff0c;…

在没有适当上下文的情况下引发异常是一种不良习惯

Allison Anders等人的《四个房间》&#xff08;1995&#xff09;。 我不断重复同样的错误。 因此&#xff0c;该停止并制定规则以防止这种情况了。 错误不是致命的&#xff0c;但很烦人。 当查看生产日志时&#xff0c;经常会看到类似"File doesnt exist" &#xff…

内存压力测试软件_日常游戏,毫无压力,荣耀Magicbook 14锐龙版性能测试

上期蚂蚁给大家带来了荣耀Magicbook 14锐龙版的初见评测&#xff0c;本期将会带来性能的测试&#xff0c;究竟这台高性价比的电脑&#xff0c;能不能应付得了日常的游戏使用呢&#xff1f;蚂蚁这次使用的测试软件分别为&#xff1a;鲁大师、CPU-Z、Cinebench R15、CrystalDiskM…