- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个关于 EAR 打包在 Java EE 应用程序中的优点和缺点的一般架构问题。我有一个部署在多个服务器环境中的 Java EE 业务应用程序。该应用程序由以下主要模块组成:
在不考虑当前不同模块的更多细节的情况下,我将这些模块打包到一个 EAR 中以部署在 GlassFish 或 WildFly 等应用服务器上:
my.ear
/
+- META-INF/
| |- application.xml
|- my_ejb_module.jar
|- my_web_module.war
|- my_restservice.war
最近WebService和微服务架构被讨论的越来越多,不知道这种封装是不是有点过时了?
在我开始这个项目几年后,这种打包似乎是最好的解决方案,因为包含业务逻辑的 EJB 模块在两个 Web 模块之间共享。
但是当我今天看自包含的微服务时,我想知道将应用程序拆分为两个可部署的 Web 模块是否更好,每个模块都包含 EJB 模块:
web-ui.war
/
+- WEB-INF/lib
| |- my_ejb_module.jar
|- my_web_module.war
restservice.war
/
+- WEB-INF/lib
| |- my_ejb_module.jar
|- my_restservice.war
在此设置中,我将能够在单独的机器上部署 REST API。因此看起来该方法对 EAR 打包没有不利影响。
这是真的吗?我的问题是关于交易的。如果两个 Web 模块在 EAR 包中共享同一个 EJB 模块,有什么优势吗?还是第二种方法(两个 Web 模块都包含相同的 EJB 模块)提供了有关事务处理和并发性的相同功能?特别是当两个 Web 模块都部署在同一个应用程序服务器上时。
目前我能看到的唯一缺点是,我的 EJB 模块不能包含 Java EE TimerServices 或 MessageDriven EJB,因为部署在 war 模块中时不支持这些类型的 EJB。但这对我来说是可以接受的。
最佳答案
我试着自己回答我的问题:在进行了一些测试部署后,我得出结论,在我的情况下,拆分是不可能的。原因是,我的 ejb 模块包含 JPA 实体 bean。如果我部署两个包含相同实体 bean 的 Web 模块,这将破坏任何 JPA 缓存概念。仅当两个 Web 模块使用相同的 REST 服务来访问 JPA 实体 bean 时,才有可能进行分离。
所以我的示例部署应该是这样的
web-ui.war
/
|- my_web_module.war
restservice.war
/
+- WEB-INF/lib
| |- my_ejb_module.jar
|- my_restservice.war
其中 restservice.war 是包含业务逻辑和数据库层(JPA 实体 bean)的主要模块,还发布了一个开放的 REST API。web-ui.war 仅包含一个 Web 应用程序,该应用程序通过来自 restservice.war 的 REST API 进行交互。但是将 ejb 模块捆绑在两个 web 模块中是一种不好的做法。 EAR 打包在将所有模块捆绑在一起的情况下是有意义的,并且提供了所有客户端模块(war 模块)可以透明地访问相同的 EJB 模块并以事务保存方式的优势。
因此,包含 JPA 实体 bean 的 EJB 模块应该只部署一次,而不应捆绑到多个部署单元中。
关于java - 与 EAR 包装相比,WAR 包装有什么缺点吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33582891/
正在尝试创建一个 python 包。似乎有效,但我收到警告。我的 setup.py 是: #! /usr/bin/env python from distutils.core import setup
我导入了一个数据类型 X ,定义为 data X a = X a 在本地,我定义了一个通用量化的数据类型,Y type Y = forall a. X a 现在我需要定义两个函数, toY 和 fro
我似乎无法让编译器让我包装 Tokio AsyncRead: use std::io::Result; use core::pin::Pin; use core::task::{Context, Po
我有两个函数“a”和“b”。当用户上传文件时,“b”被调用。 “b”重命名文件并返回新文件名。之后应该编辑该文件。像这样: def a(): edits file def b(): r
我使用 Entity Framework 作为我的 ORM,我的每个类都实现了一个接口(interface),该接口(interface)基本上表示表结构(每个字段一个只读属性)。这些接口(inter
有没有办法打开一个程序,通常会打开一个新的jframe,进入一个现有的jframe? 这里是解释,我下载了一个java游戏,其中一个是反射游戏,它在一个jframe中打开,框架内有一堆子面板,我想要做
我想要下面的布局 | AA BBBBBBB | 除非没有足够的空间,在这种情况下 | AA | | BBBBBBB | 在这种情况下,A 是复选框,B 是复选框旁边的 Text
我正在尝试以不同的方式包装我的网站,以便将背景分为 2 部分。灰色部分是主要背景,还有白色部分,它较小并包装主要内容。 基本上我想要this看起来像this . 我不太确定如何添加图像来创建阴影效果,
我正在使用 : 读取整数文件 int len = (int)(new File(file).length()); FileInputStream fis = new FileInputStream(f
我使用 maven 和 OpenJDK 1.8 打包了一个 JavaFX 应用程序我的 pom.xml 中的相关部分: maven-assembly-plugin
我正在使用两个不同的 ItemsControl 来生成一个按钮列表。
我有一个情况,有一个变量会很方便,to , 可以是 TimerOutput或 nothing .我有兴趣提供一个采用与 @timeit 相同参数的宏来自 TimerOutputs(例如 @timeit
我正在尝试包装一个名为 content 的 div与另一个具有不同背景的 div。 但是,当将“margin-top”与 content 一起使用时div,似乎包装 DIV 获得了边距顶部而不是 co
文档不清楚,它似乎允许包装 dll 和 csproj 以在 Asp.Net Core 5 应用程序中使用。它是否允许您在 .Net Core 5 网站中使用针对 .Net Framework 4.6
我被要求开发一个层,该层将充当通用总线,而不直接引用 NServiceBus。到目前为止,由于支持不引人注目的消息,这并不太难。除了现在,我被要求为 IHandleMessages 提供我们自己的定义
我正在尝试包装 getServersideProps使用身份验证处理程序函数,但不断收到此错误:TypeError: getServerSideProps is not a function我的包装看
我有一个项目,它在特定位置(不是/src/resources)包含资源(模板文件)。我希望在运行 package-bin 时将这些资源打包。 我看到了 package-options 和 packag
我正在寻找打印从一系列对象中绘制的 div。我可以通过使用下面的管道语法来实现这一点。 each i, key in faq if (key == 0) |
我在 Meteor.js“main.js - Server”中有这个方法。 Meteor.methods({ messageSent: function (message) { var a
我注意到,如果我的自定义Polymer 1.x元素的宽度比纸张输入元素上的验证错误消息的宽度窄,那么错误将超出自定义元素的右边界。参见下图: 有没有一种机制可以防止溢出,例如在到达自定义元素的边界时自
我是一名优秀的程序员,十分优秀!