【问题标题】:EJB3 Local and Remote interfacesEJB3 本地和远程接口
【发布时间】:2012-01-21 12:13:02
【问题描述】:

我了解本地接口是为同一容器的 JVM 实例中的客户端设计的,而远程接口是为驻留在 EJB 容器的 JVM 之外的客户端设计的。不驻留在(或打包)在同一个 .ear 中但驻留在同一个 Java EE 服务器上的 Web 应用程序客户端怎么样?

【问题讨论】:

  • 为什么不把 webapp 放在同一个 EAR 中? EAR 的重点正是包含应用程序的 Web 和 EJB 部分。
  • same J2EE server 是什么意思?它是否部署在同一个实例、同一个域中?
  • EAR 是单独维护和部署的,其他 WAR 希望使用来自 ejb 的一些业务方法驻留在 EAR 中。 J2EE 服务器意味着它们将部署在同一个实例上。
  • 在我的例子中,在 Glassfish 3.1 上,单独部署 web 和 ejb 模块(不涉及耳朵),在同一个实例上,并使用 @EJB 注释将 ejbs 注入 JSF 托管 bean工作。

标签: java jvm ejb-3.0


【解决方案1】:

官方@Local注解的bean只有在同一个应用程序中才能被访问。与 .ear(或其他 .war 或其他 .jar EJB)分开部署的 .war 是不同的应用程序,即使部署到同一个应用程序服务器实例也是如此。

因此没有保证 .war 中的代码可以调用 .ear 中定义的@Local EJB bean。

但是,在实践中,几乎所有应用服务器都可以这样做。

请求 EJB 3.2 规范正式支持本地跨应用程序调用:https://download.oracle.com/otndocs/jcp/ejb-3_2-fr-spec

【讨论】:

  • 作为唯一一个对此功能投票的人,我感到有些难过...每个人 - 随时加入,只需点击此 JIRA 请求的“投票”;-)
  • 可能很难有 100% 工作的跨应用程序(跨 ClassLoader!)调用。让 ClassLoader 1 有 A 类,而 ClassLoader 2 有 A 类(另一个副本)。通过本地接口传递对象 A 将导致 ClassCastException,因为同一个类有两个副本。 EAR 有自己的有时是独立的 ClassLoader。
  • 是的,类加载隔离可能是这里的问题。它仍然适用于来自 JDK 的类,也可能适用于来自 AS 的(接口)类(取决于 AS 如何对这些类进行模块化)。许多用户可能不会理解这个限制,它可能会成为 Java EE 中的新难题之一。
【解决方案2】:

本地接口将用于同一应用程序内的通信。这并不一定意味着 JVM

重点是:即使在同一个 JVM 实例中,在同一个服务器上,两个不同的应用程序不能使用本地接口(这意味着本地和无接口视图)进行通信。

如果您在同一个应用程序中同时拥有一个 Web 组件 (WAR) 和一个业务组件 (EJB-JAR),最直观和直接的解决方案是将它们打包到一个 EAR 或一个 WAR 中(Java EE 6)。

【讨论】:

  • 是的,但这只是理论。实际上,您有一个包含多个 WAR(即合作伙伴、客户和管理门户应用程序)的大型应用程序,它们调用相同的 EJB。出于部署/减少停机时间的原因,您可能希望像许多人一样单独打包这些 WAR。
  • 同意 - 我也不喜欢这个想法和繁琐的 EAR 方法,但这是官方建议的解决方案。
  • 不要让我开始接触 JEE 人。整个事情是一个工作保障项目。多年来,我们一直在复杂的项目中使用它,我必须说我们在 PHP 中的生产力提高了 10 倍。但是现在PHP很“不酷”,各种认证的人,今天你必须有一个证书才能卖卫生纸,所以我们都不得不忍受臃肿的废话* t什么都做不好。它让我想起了 F-35。 ;)
【解决方案3】:

远程接口可以跨应用程序调用,可以从应用程序服务器内部的任何地方调用,也可以从外部调用,甚至可以从其他主机调用。

因此假设您需要远程 (@Remote) 接口。在 EJB 3.1 中,您可以使用依赖注入。

【讨论】:

    【解决方案4】:

    您使用远程接口,但您使用 JNDI 进行查找(我就是这样做的),这样您就可以在服务器中找到 EJB 的实例,并可以在您的 Web 应用程序中使用它。

    尽管您仍然需要在 Web 应用程序项目中使用 EJB 接口的 jar。

    编辑并且我同意 JB Nizet 的观点,您为什么要在 EAR 之外进行 WAR?

    【讨论】:

    • 由于类加载的恶作剧,您可能需要单独部署它。
    猜你喜欢
    • 2020-09-03
    • 1970-01-01
    • 1970-01-01
    • 2011-04-17
    • 1970-01-01
    • 2011-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多