5

好的,这里仍然试图理解基本的 EE 6 概念。我希望这里有人可以帮助我。

我正在使用单个域运行 GlassFish v3 服务器 Kukla。我部署了 MyEEApp.ear,其中包含 MyEEWebApp.war、MyEJBs.jar 和 MyUtilityLibrary.jar。我的 EJB jar 包含一个名为 MySingleton 的 @Singleton bean。

然后我设置了另一个服务器,称为 Fran,并部署了相同的 EAR。我对名为 Ollie 的第三台服务器执行相同的操作。

三个完全相同的 EAR 文件部署到三个完全相同(名称和 IP 地址除外)的服务器上。

所以这是我的问题:

  1. 在给定的服务器上,比如 Kukla,我有多少个“容器”?EAR 是否只有一个容器?还是 WAR 和 EJB jar 也有自己的容器?
  2. 第一个答案的实际影响是什么?
  3. 就此而言,容器到底是什么?
  4. 我的 WAR 中的类可以使用 @EJB 注入来访问 EJB jar 中的 bean,因为它们都是同一个 EAR 的一部分吗?
  5. 就此而言,普通的旧 Java 类可以使用@EJB 注入,还是仅适用于其他 EJB?
  6. 我将创建多少个单例 bean 实例?每台服务器一个?还是只有一个?如果每台服务器一个,有没有办法保证整个集群中的“真正”单例?
  7. 在 GlassFish 中,我应该在哪里以及如何配置 JNDI 来查找资源?比如说,我是否可以将 EJB jar 从一台机器移动到另一台机器并让 Web 应用程序自动找到它?
  8. 是否可以为 EJB bean 配置负载平衡?如果是这样,怎么做?
  9. 那么三个 WAR 实例呢?有没有办法配置负载平衡,以便请求转到使用最少的机器上的实例?

我知道,很多问题。对于那个很抱歉!

您的帮助将不胜感激!杰夫

4

1 回答 1

17

在给定的服务器上,比如 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

(部分)资源

于 2010-09-22T04:36:00.800 回答