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

jboss4 迁移

几周前,我发布了一个有关从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配置的示例:

欠佳

/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

jboss4 迁移

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

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

相关文章

java xmlrpc2.0 实现_简单的java xmlrpc

&#xfeff;&#xfeff;简单的 XMLRPCjava---XmlRpcClientpackage com.company;import org.apache.xmlrpc.XmlRpcClient;import org.apache.xmlrpc.XmlRpcException;import java.net.MalformedURLException;import java.util.Hashtable;import java.util.Vector;public class…

操作方法:带有Thymeleaf和Spring Boot的Java 8日期和时间

如果您碰巧使用Spring Boot和Thymeleaf&#xff0c;并且需要在视图中格式化Java 8 Date&#xff06;Time对象&#xff0c;则可以使用thymeleaf-extras-java8time –用于Java 8 Date&#xff06;Time API的Thymeleaf模块。 向现有的基于Maven或Gradle的Spring Boot项目中添加th…

java boundary_上传文件multipart form-data boundary 说明

含义 ENCTYPE"multipart/form-data" 说明&#xff1a;通过 http 协议上传文件 rfc1867协议概述&#xff0c;客户端发送内容构造。概述在最初的 http 协议中&#xff0c;没有上传文件方面的功能。 rfc1867为 http 协议添加了这个功能。客户端的浏览器&#xff0c;如 M…

java 预处理语句_预处理语句PreparedStatement到底咋用啊

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼我自己试了一下直接查询id为1的语句&#xff0c;有一条结果出来&#xff0c;但是用了PreparedStatement后就没有结果了&#xff0c;有大佬知道为什么吗orzpackage test;import java.io.IOException;import java.io.PrintWriter;imp…

crud-table_我个人的CRUD故事-或我如何来到CUBA平台

crud-table在此博客文章中&#xff0c;我想介绍一下我如何使用CUBA平台以及该工具的好处。 在我年轻的“业务应用程序开发”历史上&#xff0c;我将深入探讨各个阶段&#xff0c;只是给您一些背景知识。 因此&#xff0c;让我们从如何进入典型的CRUD应用程序开始&#xff0c;以…

python api接口生成_Django 自动生成api接口文档教程

最近在写测试平台&#xff0c;需要实现一个节点服务器的api,正好在用django&#xff0c;准备使用djangorestframework插件实现。需求实现一个接口&#xff0c;在调用时&#xff0c;通过传递的参数&#xff0c;直接运行对应项目的自动化测试环境Python3.6 ,PyCharm,W7项目结构功…

eclipse clean_Clean Sheet – Windows 10的人体工程学Eclipse主题

eclipse cleanClean Sheet是适用于Windows 10的符合人体工程学的Eclipse主题。它基于干净&#xff0c;低眩光的外观和感觉&#xff0c;旨在减轻视觉疲劳和眼睛疲劳。 它融合了均衡的颜色选择&#xff0c;可以突出谐波语法并注重可读性。 除自定义滚动条外&#xff0c;它还努力满…

什么时候需要使用cqrs_在CQRS读取模型中使用Hibernate进行快速开发

什么时候需要使用cqrs在本文中&#xff0c;我将分享一些在CQRS读取模型中使用Hibernate工具进行快速开发的技巧。 为什么要Hibernate&#xff1f; Hibernate非常流行。 从外观上看&#xff0c;它也很容易&#xff0c;而从内部看&#xff0c;它却相当复杂。 它可以很容易地上手…

java面试题三_最全的java面试题目三

78、什么情况下调用doGet()和doPost()&#xff1f;答&#xff1a;Jsp页面中的form标签里的method属性为get时调用doGet()&#xff0c;为post时调用doPost()。79、servlet的生命周期答&#xff1a;web容器加载servlet&#xff0c;生命周期开始。通过调用servlet的init()方法进行…

python的内存管理机制及调优手段_Python的内存管理机制及调优手段

内存管理机制&#xff1a;引用计数、垃圾回收、内存池引用计数&#xff1a;引用计数是一种非常高效的内存管理手段&#xff0c;当一个Python对象引用时其引用计数加一&#xff0c;当其不再被一个变量引用时则减一。当引用计数等于0时对象被删除。1.引用计数&#xff1a;引用计数…

tcga癌症亚型获取_亚型多态性应用于元组的危险

tcga癌症亚型获取Java 8具有lambda和stream&#xff0c;但是没有元组&#xff0c;这真是令人遗憾 。 这就是为什么我们在jOOλ中实现了元组-Java 8的缺失部分 。 元组确实是无聊的值类型容器。 本质上&#xff0c;它们只是这些类型的枚举&#xff1a; public class Tuple2<…

java 隐藏了什么_JAVA程序中封装与隐藏是什么意思

qq_遁去的一_1隐藏就是封装吧。。。。封装是把过程和数据包围起来&#xff0c;对数据的访问只能通过已定义的界面。面向对象计算始于这个基本概念&#xff0c;即现实世界可以被描绘成一系列完全自治、封装的对象&#xff0c;这些对象通过一个受保护的接口访问其他对象。封装是一…

esb 和 开源esb_如果今天完成,ESB会是什么样子?

esb 和 开源esbJavaOne 2015即将结束&#xff0c;这又是一次很棒的社区活动。 我和Rafael进行了两次会议和一次HOL 。 我最喜欢的会议之一实际上是&#xff1a;谈论ESB&#xff0c;如果今天完成的话。 我以为那是过去&#xff1f; 我通常也倾向于这样说。 但是&#xff0c;系统…

log4j2 无日志记录_在Log4j2中更好地执行非日志记录器调用

log4j2 无日志记录使用Log4j 1.x并希望避免在某些情况下可能会造成额外的性能影响&#xff08;即使实际上未记录该消息&#xff09;时&#xff0c;通常使用日志记录防护 。 Java的简单日志记录外观 &#xff08; SLF4J &#xff09;带给Java日志记录的最吸引人的功能之一是能够…

JAVA8如何进行IDEA配置_IntelliJ Idea 配置jdk8

环境&#xff1a; 环境变量JAVA_HOME配置jdk1.8idea配置支持lambda&#xff1a;File -> Project Structure -> Modules -> Language level, 选择: 8-Lambdas, type annotations etc.File -> Project Structure -> Project -> Project language level, 选择…

spring 占位符默认值_Spring中的值注释中的占位符支持

spring 占位符默认值Value批注中的${...}占位符用于访问在PropertySource注册的属性。 这对于Spring应用程序中的Configuration bean非常有用&#xff0c;但不仅如此。 为确保这是可能的&#xff0c; PropertySourcesPlaceholderConfigurer必须存在于所有需要占位符解析的应用程…

java用户名检查数据库_登入界面账号密码是访问数据库,但登入问题时if判断时就是执行不了...

回复 2楼 林月儿我按着你的方法试了下&#xff0c;可还是这个判断不能执行 if(password.equals(drmm.getText())){view.setText("登入成功");完整代码如下&#xff1a;import java.awt.*;import java.awt.event.*;import *;import *;import java.…

五皇后问题 java_Java的5个古怪问题

五皇后问题 java我们有机会接触到一些最奇怪的Java难题 即使是最有经验的Java开发人员&#xff0c;也会在这篇文章中发现令人困惑的问题。 或者至少是有趣的&#xff08;绝对不公平&#xff09;。 在经历了Java Deathmatch冒险之后&#xff0c;我们决定这次发布一系列不同的问…

java加密成固定长度_Java使用MD5加密,生成的密文长度只有31位

在使用MD5加密时&#xff0c;生成的密文长度只有31位&#xff0c;该怎么解决&#xff1f;代码如下&#xff1a;public static String toMd5(String str) {String re null;byte encrypt[];try {byte[] tem str.getBytes();MessageDigest md5 MessageDigest.getInstance("…

可以自定义模板的ide_将IDE检查应用于自定义Java批注

可以自定义模板的ideJ2SE 5中注释的引入改变了我们编写和处理Java的方式。 除了Java SE的预定义注释外 &#xff0c;框架&#xff0c;IDE和工具包还引入了自己的自定义注释 。 Checker框架提供了一些示例&#xff0c;说明如何使用自定义批注在Java中增加类型安全性 。 在本文中…