在部署描述符和瘦客户机中查找名称支持
相对于安装应用程序所在的服务器的服务器根上下文,应用程序对象(例如企业 Bean (EJB) home)是绑定的。其他对象(例如资源)也可以帮定到特定的服务器根。用于查找这些对象的名称必须是限定的,这样才能选择正确的服务器根。本主题讨论什么是相对名和限定名、何时可以使用它们以及可以如何构造它们。
从 V8.0 开始,EJB Home 以名称 java:global/appName/moduleName/beanName 进行绑定。此格式的名称并非基于拓扑,并且已经是标准名称。同样,如果指定了 java:global、java:app 或 java:module 查找名称,那么所有使用 java:global、java:app 或 java:module 名称进行绑定的应用程序资源都不需要另外进行限定。例如,应用程序资源包括 EJB 引用、资源引用和环境条目。
相对名
所有名称都是相对于上下文的。 所以,不必从名称空间的一个上下文中解析可以从名称空间中另一个上下文解析的名称。这很重要,因为系统将对象与相对于安装了应用程序的服务器的服务器根上下文的名称绑定。 每个服务器都有它自已的服务器根上下文。缺省情况下,初始 Java™ 命名和目录接口 (JNDI) 上下文是用来获取初始上下文的提供程序 URL 所标识的服务器的服务器根上下文。 (通常,URL 由主机和端口组成。)对于在服务器进程中运行的应用程序,缺省初始 JNDI 上下文是该服务器的服务器根。从包含目标对象的服务器获取初始上下文时,将成功地解析相对名,但是从另一个服务器获取的初始上下文解析它将会失败。
如果服务器应用程序的所有客户机在与应用程序相同的服务器进程中运行,那么与该应用程序关联的所有对象都将与客户机的初始上下文绑定。在这种情况下,访问这些服务器对象只需要相对于该服务器的服务器根上下文的名称。 但是,服务器应用程序经常会有在应用程序的服务器进程外运行的客户机。这些客户机的初始上下文可能与服务器应用程序的初始上下文不相同,因而查找服务器对象的相对名可能会失败。这些客户机需要使用服务器对象的限定名。在 Java Platform Enterprise Edition (Java EE) 客户机应用程序部署描述符中设置 jndiName 值时以及在瘦客户机中构造查询名称时,必须考虑这一点。从单元中的任何初始上下文成功地解析限定名。
限定名
所有名称都是相对于上下文的。 此处,术语限定名指的是可以从单元中的任何初始上下文解析的名称。通过使用导航至相同的上下文(单元根)的名称实现此操作。然后,限定名的其余部分与单元根相关,并且在整个单元中唯一地识别对象。服务器中的所有初始上下文(即,向 ORB 注册为初始引用的服务器中的所有命名上下文)包含带名称 cell 的绑定,这会链接回单元根上下文。所有限定名都以字符串 cell/ 开头,以从当前初始上下文导航回单元根上下文。
对象的限定名在整个单元中是相同的。名称可以是基于拓扑的名称,也可以是某些绑定在单元持久根下的固定名。基于拓扑的名称(本节的稍后部分进行了更为详细的描述)经过整个系统名称空间直至到达目标对象。绑定在单元持久根下的固定名在整个单元中有相同的限定名,并且与拓扑无关。在单元持久根下为服务器应用程序对象创建固定名需要在安装服务器应用程序时执行一个额外的步骤,但是此步骤会消除在应用程序移动到单元拓扑中的不同位置时对客户机产生的影响。随后的内容还对创建固定名称的过程作了描述。
通常,对于 Java EE 客户机应用程序部署描述符中的 EJB jndiName 值,以及对于瘦客户机中的 EJB 查找名称,必须使用限定名。唯一的例外是在从驻留目标对象的服务器获取初始上下文时。例如,作为实体 Bean 的客户机的会话 Bean 可以使用相对名(如果它们在同一个服务器中运行的话)。如果会话 Bean 和实体 Bean 在不同的服务器中运行,那么必须在会话 Bean 的部署描述符中限定实体 Bean 的 jndiName。相同的需求对于资源也可能为真,这取决于资源的范围。
- 基于拓扑的名称
单元名称空间中的系统名称空间分区反映了单元的拓扑。可以浏览此结构以到达与单元的名称空间绑定的任何对象。基于拓扑的限定名包含来自反映单元中的对象位置的元素。
对于系统绑定的对象(例如,EJB home),基于拓扑的限定名的格式取决于对象是与单个服务器绑定还是与集群绑定。下面对这两种格式进行描述:
- 单个服务器
- 绑定在单个服务器中的对象有下列格式的基于拓扑的限定名:
其中 nodeName 和 serverName 是节点名和绑定对象的服务器的服务器名,而 relativeJndiName 是对象的未限定名;即,对象的相对于其服务器的服务器根上下文的名称。cell/nodes/nodeName/servers/serverName/relativeJndiName
- 服务器集群
- 绑定在服务器集群中的对象有下列格式的基于拓扑的限定名:
其中 clusterName 是绑定对象的服务器集群的名称,而 relativeJndiName 是对象的未限定名;即,对象的相对于集群成员的服务器根上下文的名称。cell/clusters/clusterName/relativeJndiName
- 固定名
可以为服务器对象创建固定名,以使得限定名与单元拓扑不相关。当应用程序的客户机在其他服务器进程中运行或者它们是作为纯客户机时,需要此特性。如果将对象移动到另一个服务器,固定名有保持不变的优点。Java EE 客户机应用程序的部署描述符中的 jndiName 值可以引用服务器对象的限定固定名,不管客户机或服务器应用程序所安装的单元拓扑。
定义服务器应用程序对象的单元范围固定名需要在安装服务器应用程序后执行一个额外的步骤。即,必须在单元持久根下创建对象的绑定。绑定在单元持久根下的固定名可以是任何名称,但是单元持久根下的所有名称在该单元内必须唯一,这是因为单元持久根对于整个单元是全局的。
限定固定名的格式为:
其中 fixedName 是任意固定名。cell/persistent/fixedName
可以程序化地创建绑定(例如,使用 JNDI)。但是,为服务器对象配置单元作用的绑定可能更加方便。
您必须保持可编程绑定或已配置绑定始终是最新的。配置的 EJB 绑定是根据单元拓扑中的企业 Bean 的位置,以及将 EJB 应用程序移动到另一个服务器,例如,需要更新配置的绑定。类似的更改影响程序化地绑定的 EJB home 引用,这样将需要用当前引用重新绑定固定名。但是,对于 Java EE 客户机,对象的 jndiName 值保持不变;而对于瘦客户机,对象的查询名称保持不变。换而言之,更改到它们访问的服务器应用程序配置,不会影响按固定名访问对象的客户机。
在部署描述符绑定中使用查询名称
Java EE 应用程序可以包含用来声明不同类型引用的部署描述符(例如 ejb-ref、resource-ref 和 resource-env-ref)。这些引用声明定义了可供相应 Java EE 组件使用的 java:comp/env 查找名称。必须将每个 java:comp/env 查找名称映射到全局名称空间中的查找名称(相对于服务器根上下文,即缺省的初始 JNDI 上下文)。
如果引用映射到作为执行查询组件的同一服务器的服务器根上下文下绑定的对象,那么您可以使用相关的查询名称。如果引用映射到其他服务器的服务器根上下文下绑定的对象,那么您必须限定查询名称。例如,如果运行在一个服务器上的 Servlet 声明运行在其他服务器上的 EJB 的 ejb-ref,那么您必须限定查询名称。同样地,如果引用映射至与名称空间的持久性分区绑定的对象,或映射至通过单元范围或节点范围配置名称空间绑定来绑定的对象,那么您必须使用限定名。
在安装应用程序时,您可以指定部署描述符引用绑定值,并且可以在应用程序安装完成后编辑这些值。如果需要更改引用所映射至的 JNDI 查找名称,请在管理控制台中单击目标资源 JNDI 名称字段中指定新值。
。在引用部分中,包含对应不同引用类型的链接,例如此应用程序声明的 EJB 引用和资源环境条目引用。单击您需要更改的引用类型的链接,然后在