【问题标题】:What is a global JNDI name and why does it differ between app servers?什么是全局 JNDI 名称,为什么它在应用服务器之间有所不同?
【发布时间】:2014-07-24 00:05:29
【问题描述】:

我正在从EJB in Action 一书中学习 EJB 3,这本书在第 5 章中讨论了环境命名上下文 (ENC)。它是这样说的:

如果您知道 JNDI 引用在 EJB 2 中是如何工作的,那么您应该熟悉 环境命名上下文 (ENC)。 ENC允许的便携性 应用程序,而不必依赖全局 JNDI 名称。全球 JNDI 资源名称在应用服务器实现之间有所不同, ENC 允许您使用以 java:comp/env/ 而不是硬编码实际的全局 JNDI 名称。 EJB 3 基本上假定代码中使用的所有 JNDI 名称都是本地的 引用并自动在名称前面加上 java:comp/env/ 前缀。

我不明白全局 JNDI 名称是什么意思?为什么它必须在应用服务器之间有所不同?

我将问题标记为 EJB2 和 EJB 3,因为引用引用了这两个版本。如果您有其他想法,请随时编辑。

【问题讨论】:

    标签: ejb ejb-3.0 jndi ejb-2.x


    【解决方案1】:

    全局 JNDI 名称使用默认 JNDI 上下文中的名称。例如,在 WebSphere Application Server 上,远程 EJB 默认绑定到 ejb/<app>/<module>/<bean>#<interface>。如果您在应用程序中对该查找字符串进行硬编码,那么如果目标应用程序或模块名称发生更改,则该应用程序将无法移植到其他应用程序服务器(可能使用不同的默认名称方案),甚至不能移植到同一个 WebSphere Application Server。

    EE 中的解决方案是让您的应用程序声明一个 EJB 引用,该引用将位于 java:comp/env 上下文中,名称由您选择。当部署者在服务器上安装您的应用程序时,他们可以将 java:comp/env 名称绑定到适合环境的全局 JNDI 名称。所有 EE 资源(数据源、String/int/boolean 配置值等)实际上都使用了相同的模式,如果使用得当,它是 EE 平台的优势之一。

    如果没有更多上下文,我无法说出上面摘录的内容。也许它指的是EJBContext.lookup 方法,它实际上是相对于java:comp/env 进行查找的快捷方式。

    最后,我要注意的是,EJB 3.1 为 EJB 绑定定义了一个标准位置 java:global/<app>/<module>/<bean>!<interface>。无论如何,在跨应用程序(如果您无法完全控制包含 EJB 客户端的应用程序,甚至跨模块)进行查找时,使用 EJB 引用仍然是最佳实践。

    【讨论】:

    • 那么java:comp/env上下文和默认JNDI上下文有什么区别?
    • java:comp/env 填充了应用程序声明的名称。默认 JNDI 上下文由服务器管理员(例如,数据源)或服务器本身(例如,默认 EJB 绑定)声明的名称填充。
    • 解释也与this answer concerning DataSource相关。
    猜你喜欢
    • 1970-01-01
    • 2016-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-04
    • 1970-01-01
    相关资源
    最近更新 更多