示例:获取缺省初始上下文
程序获取缺省初始上下文有各种方式。
以下示例获取缺省初始上下文。注意,未将提供程序 URL 传递给 javax.naming.InitialContext 构造函数。
...
import javax.naming.Context;
import javax.naming.InitialContext;
...
Context initialContext = new InitialContext();
...
返回的缺省初始上下文取决于 Java™ 命名和目录接口 (JNDI) 客户机的运行时环境。以下是在各种环境中返回的初始上下文:
- 瘦客户机
- 初始上下文是端口 2809 上的本地主机上运行的服务器的服务器根上下文。
- 纯客户机
- 初始上下文是用 -CCD 命令行参数传递给 launchClient 命令的 java.naming.provider.url
属性指定的上下文。尽管可以构造解析为其他一些上下文的 corbaname 或 corbaloc URL,但上下文通常是 URL 中指定地址处的服务器的服务器根上下文。
如果未指定提供程序 URL,那么它是在 -CCproviderURL 或 -CCBootstrapHost 和 -CCBootstrapPort 命令行参数指定的主机和端口上运行的服务器的服务器根上下文。缺省主机是本地主机,而缺省端口为 2809。
- 服务器进程
- 初始上下文是该进程的服务器根上下文。
即使在上面的示例中未显式地指定提供程序 URL,InitialContext 构造函数还是可能会在其他位置(它在其中搜索属性设置)找到定义的提供程序 URL。
使用对 ORB 初始化有影响的属性的用户应该阅读本节的其余部分,以进一步理解初始上下文到底是怎样获取的。
确定用哪个服务器获取初始上下文
WebSphere® Application Server名称服务器是 CORBA CosNaming 名称服务器,此产品为 JNDI 客户机提供 CosNaming JNDI 插件实现以在产品名称空间上执行命名操作。 通过传递到 InitialContext 构造函数的 JNDI 属性,选择 CosNaming 插件实现。此属性为 java.naming.factory.initial,它指定用于获取初始上下文的初始上下文工厂实现。 该工厂返回 javax.naming.Context 实例,该实例是它的实现的一部分。
应用程序通常使用初始上下文工厂 com.ibm.websphere.naming.WsnInitialContextFactory 来执行 JNDI 操作。如果 JNDI 客户机没有明确地指定初始上下文,那么 WebSphere Application Server 运行时环境将设置为使用此初始上下文工厂。调用初始上下文工厂时,获取初始上下文。以下段落解释初始上下文工厂如何获取客户机和服务器环境中的初始上下文。
- 注册服务器进程中的初始引用
每个 WebSphere Application Server 都包含一个用来接收和分派运行在该服务器中对象上的调用的 ORB。服务器进程中运行的服务可以用 ORB 注册初始引用。在为字符串值的键下注册每个初始引用。初始引用可以是任何 CORBA 对象。WebSphere Application Server 名称服务器注册一些初始上下文作为预先定义键下的初始引用。每个名称服务器初始引用都是接口 org.omg.CosNaming.NamingContext 的实例。
- 获取纯客户机进程中的初始引用
纯 JNDI 客户机(即不运行在 WebSphere Application Server 进程中的 JNDI 客户机)也包含 ORB 实例。此客户机 ORB 实例可以传递到 InitialContext 构造函数,但是通常初始上下文工厂会明显地创建和初始化客户机 ORB 实例。可以用初始引用初始化客户机 ORB,但是初始引用很可能解析为一些服务器中运行的对象。初始上下文工厂初始化 ORB 时,它不定义任何缺省初始引用。如果在未配置初始引用的情况下在客户机 ORB 上调用 resolve_initial_references 方法,那么方法调用将失败。纯客户机进程通常会发生这种情况。要获取初始 NamingContext 引用,初始上下文工厂必须用 IIOP 类型 CORBA 对象 URL(例如 corbaloc:iiop:myhost:2809)调用 string_to_object。该 URL 指定要从中获取初始上下文的服务器地址。从传递到 InitialContext 结构函数的提供程序 URL 中抽取主机和端口信息。
如果没有定义提供程序 URL,那么 WebSphere Application Server 初始上下文工厂使用缺省的提供程序 URL:corbaloc:iiop:localhost:2809。
如果没有定义提供程序 URL,那么 WebSphere Application Server 初始上下文工厂使用缺省的提供程序 URL:corbaloc:iiop:your.server.name:2809。
string_to_object ORB 方法解析 URL 并与目标服务器 ORB 通信以获取初始引用。
- 获取服务器进程中的初始引用
如果 JNDI 客户机运行在 WebSphere Application Server 进程中,那么初始上下文工厂将获取服务器 ORB 实例的引用(如果 JNDI 客户机不提供 ORB 实例)。通常,JNDI 客户机在使用服务器 ORB 实例的服务器进程中运行;即,它们不将 ORB 实例传递给 InitialContext 构造函数。服务器进程中运行的名称服务器将提供程序 URL 设置为 java.lang.System 属性,以充当进程中的所有 JNDI 客户机的缺省提供程序 URL。此缺省提供程序 URL 为 corbaloc:rir:/NameServiceServerRoot。此 URL 解析为该服务器的服务器根上下文。(该 URL 与用 NameServiceServerRoot 键在 ORB 上调用 resolve_initial_references 等价。名称服务器将服务器根上下文注册为该键下的初始引用。)
- 理解旧的 ORB 协议
WebSphere Application Server V5 之前的发行版使用不同的 ORB 实现,该实现使用的遗传协议与现在使用的互操作命名服务 (INS) 协议形成对比。此更改已经影响初始上下文工厂的实现。在获取初始 JNDI 上下文时,与 WebSphere Application Server 的前发行版相比,某些类型的纯客户机可能出现不同的行为。此节后面的部分更详细地讨论了此行为。
旧 ORB 协议为 ORB 初始化使用下列 ORB 属性,而现在不推荐使用这些属性:
- com.ibm.CORBA.BootstrapHost
- com.ibm.CORBA.BootstrapPort
新的 INS ORB 有一个主要的不同之处,这是因为如果不定义初始引用,它不显示缺省行为。
在旧的 ORB 中,引导主机值和端口值缺省为 localhost 和 900。
在旧的 ORB 中,引导主机值和端口值缺省为 your.server.name 和 900。
所有初始引用都从引导主机和端口上运行的服务器中获取。因此,如果 ORB 用户不提供引导主机和端口,那么从端口 900 的本地主机上运行的服务器解析所有初始引用。INS ORB 没有引导主机或引导端口的概念。所有初始引用都是单独定义的。即,不同的初始引用可解析成不同的服务器。如果用键调用 ORB.resolve_initial_references 以使得不用具有该键的初始引用初始化 ORB,那么调用将失败。
在 V5 之前的发行版中,在没有任何提供程序 URL 的情况下,初始上下文工厂调用 ORB 上的 resolve_initial_references。如果缺省引导主机和端口上的名称服务器在运行,那么此操作会成功。在当前发行版中,使用 INS ORB,此操作会失败。(实际上,在不赞成的时期内,ORB 会回退到旧协议,而当该旧协议不再受支持时,该操作将失败。)
初始上下文工厂现在使用缺省提供程序 URL corbaloc:iiop:localhost:2809,并且用提供程序 URL 调用 string_to_object。
初始上下文工厂现在使用缺省提供程序 URL corbaloc:iiop:your.server.name:2809,并且使用提供程序 URL 调用 string_to_object。
当它们不设置 ORB 引导属性或提供程序 URL 时,此操作保留纯客户机在前发行版中遇到的行为。然而,这个不同的初始上下文工厂实现更改某些不指定提供程序 URL 的旧纯客户机遇到的行为:
- 上面列出了获取初始上下文时设置 ORB 引导属性的客户机。
- 提供它们自已的 ORB 实例给 InitialContext 构造函数的客户机。
有两种方法可以避免此行为更改:
- 总是指定 IIOP 类型提供程序 URL。此方法与引导主机和端口属性无关,并且在移除对引导主机和端口属性的支持时仍然有效。例如,就 corbaloc:iiop:myHost:2809 而言,您可以分别将引导主机属性值和端口属性值表示为 myHost 和 2809。
- 使用 rir 类型提供程序 URL:
- 如果已初始化 ORB 来使用 V5 服务器作为引导程序服务器,请指定 corbaloc:rir:/NameServiceServerRoot。
- 如果已初始化 ORB 来使用 V4.0.x 服务器作为引导程序服务器,请指定 corbaname:rir:/NameService#domain/legacyRoot。
- 如果已初始化 ORB 来使用非 V5 或 V4.0.x 的服务器作为引导程序服务器,请指定 corbaloc:rir:/NameService。
此类型的 URL 与用指定的键在 ORB 上调用 resolve_initial_references 等价。如果要使用引导主机和端口属性初始化 ORB,那么当引导主机和端口属性不再受支持时,此方法将失效。
- InitialContext 构造函数搜索 JNDI 属性的顺序
如果本节开始处显示的代码段由应用程序执行,那么引导服务器依赖于属性 java.naming.provider.url 的值。
如果未设置属性(在服务器进程中,缺省值设置为系统属性),那么缺省主机 localhost 和缺省端口 2809 用作要从中获取初始上下文的服务器地址。
如果未设置该属性(在服务器进程中,缺省值设置为系统属性),那么缺省主机 your.server.name 和缺省端口 2809 用作要从中获取初始上下文的服务器地址。
JNDI 规范描述 InitialContext 构造函数在哪里查找 java.naming.provider.url 属性设置,但是简要地,从下列位置中以显示的顺序检取属性:
- InitialContext 构造函数
- 这不适用于上面的示例,这是因为该示例使用空的 InitalContext 构造函数。
- 系统环境
- 您可以将 JNDI 属性作为 Java 命令调用的选项并且通过程序代码添加到系统环境。在系统环境中设置提供程序 URL 的建议方法是作为向 Java 命令调用提供的选项。当前不采用此方式设置提供程序 URL,因此获取缺省初始上下文将总是产生相同的结果。通常建议程序代码不要在系统环境中设置提供程序 URL 属性,这是因为该设置会产生副作用,它可能会不利地影响在同一个进程的其他地方运行的其他(可能是不相关的)代码。
- jndi.properties 文件
- 在类装入器的作用域内可能有很多 jndi.properties 文件都有效。所有 jndi.properties 文件都用于设置 JNDI 属性,但是提供程序 URL 设置由类装入器返回的第一个 jndi.properties 文件确定。