在给定的服务器上,比如 Kukla,我有多少个“容器”?EAR 是否只有一个容器?还是 WAR 和 EJB jar 也有自己的容器?
“容器”这个术语可能有点模糊,但我会这样表述:一个成熟的 Java EE 应用程序服务器,如 GlassFish,提供 Web 容器和 EJB 容器。在部署 EAR 时,WAR(s) 将由 Web 容器部署和管理,而 EJB(s) 将由 EJB 容器部署和管理。下图说明了这一点(来自Java EE 教程):
不知何故——如果我把事情弄糊涂了,我已经感到很抱歉——EAR 也是一种(逻辑)容器,因为 Java EE 服务器将为每个 EAR 和 EAR 内的 Java EE 模块提供定义良好的隔离类加载器层次结构。查看
Packaging EJB 3 Applications中的Java EE 应用程序中的类加载,以获得对类加载的很好的介绍。
第一个答案的实际影响是什么?
这个问题很模糊,但是......这里有一些例子:
- 给定的应用服务器实例只能运行服务的子集(例如 Web 容器或 EJB 容器)
- 您可以将 EAR 的各个模块部署到集群的不同实例(节点 1、2 的 WAR 和节点 3、4、5、6 的 EJB-JAR)
就此而言,容器到底是什么?
用我的话来说,为部署在上面的组件提供运行时环境和服务的东西。Tomcat是一个(Web)容器,OpenEJB是一个(EJB)容器,Spring是一个(IoC)容器。
有关更正式的“Java EE”定义,请查看 Java EE 教程的Java EE 容器部分。
我的 WAR 中的类可以使用 @EJB 注入来访问 EJB jar 中的 bean,因为它们都是同一个 EAR 的一部分吗?
是的他们可以。
就此而言,普通的旧 Java 类可以使用@EJB 注入,还是仅适用于其他 EJB?
在 Java EE 6 之前,只有EJB、Servlet、过滤器、JSF 托管 Bean 等托管组件可以从注入中受益。但是使用 Java EE 6,现在可以使用 CDI(Java C上下文和依赖注入)将任何类转换为托管 bean。在这种情况下,你可以这样做:
@Inject MyEJB service
但是您的 POJO 需要是 CDI 管理的 bean。
我将创建多少个单例 bean 实例?每台服务器一个?还是只有一个?如果每台服务器一个,有没有办法保证整个集群中的“真正”单例?
该规范不包括集群支持,但恕我直言,大多数供应商很可能会让 Singletons 集群安全,就像有状态会话 Bean 一样(否则您将无法共享状态,这会使它们不是很有用)。但没有严格的答案。
请记住,市场上还没有 Java EE 6 集群感知容器(好吧,GlassFish 3.1从里程碑 1开始就具有基本集群支持和应用程序版本控制,但 GF 3.1 还不是最终版本,最终版本计划在年底发布年)。
在 GlassFish 中,我应该在哪里以及如何配置 JNDI 来查找资源?比如说,我是否可以将 EJB jar 从一台机器移动到另一台机器并让 Web 应用程序自动找到它?
在创建InitialContext
或提供jndi.properties
. GlassFish 带有一个默认的(in jndi-properties.jar
),如果需要,可以将您的应用程序捆绑到您的应用程序中。
是否可以为 EJB bean 配置负载平衡?如果是这样,怎么做?
负载平衡由为集群 EJB 获得的 EJB 客户端存根处理,默认策略通常是循环负载平衡。其他典型策略包括基于权重的负载平衡、随机负载平衡(也许还有其他)。但我不知道 GlassFish 将支持哪些策略。
如前所述,除非您开始使用 GlassFish 3.1 的 Milestone 版本,否则尚不支持集群。
那么三个 WAR 实例呢?有没有办法配置负载平衡,以便请求转到使用最少的机器上的实例?
我想说这完全取决于负载平衡器(可能是硬件、软件)。我将简单介绍一下常见的 Apache mod_jk 方法。据我所知,Apache mod_jk 可以使用以下三种方法之一来分配工作:
- B(忙碌):选择当前正在进行的请求数量最少的工作人员
- R (requests):选择总体上处理的请求数量最少的工作人员
- T (traffic): 选择传输最少字节数的worker
(部分)资源