示例:用 CosNaming 获取初始上下文
在 WebSphere® Application Server 中,可从引导服务器中获取初始上下文。引导服务器的地址由主机和端口组成。要获取初始上下文,您必须知道用作引导服务器的服务器的主机和端口。
获取初始上下文由两个基本步骤组成:
- 获取 ORB 引用。
- 使用 ORB 引用来获取初始上下文。或者,使用现有 ORB 以及使用具有多个名称服务器地址的 CORBA 对象 URL 调用 string_to_object 来获取初始上下文。
获取 ORB 引用
纯 CosNaming 客户机(即,不在服务器进程中运行的客户机)必须创建和初始化 ORB 实例,要使用该 ORB 来获取初始上下文。在服务器进程中运行的 CosNaming 客户机可以用 JNID 查找获取对服务器 ORB 的引用。下面的示例说明如何创建和初始化客户机 ORB 以及如何获取服务器 ORB 引用。
创建客户机 ORB 实例
要创建 ORB 实例,调用静态方法 org.omg.CORBA.ORB.init。init 方法需要设置为您要实例化的 ORB 类的名称的属性。随产品一起提供了具有类名 com.ibm.CORBA.iiop.ORB 的 ORB 实现。WebSphere Application Server ORB 识别其他属性,您可以通过这些属性来指定初始引用。
下面是创建 ORB 的基本步骤:
- 创建 Properties 对象。
- 将 ORB 类属性设置为产品的 ORB 类。
- 设置初始引用属性。
- 调用 Properties 对象中传递的 ORB.init。
![[AIX]](../images/aixlogo.gif)
![[HP-UX]](../images/hpux.gif)
![[Linux]](../images/linux.gif)
![[Solaris]](../images/solaris.gif)
![[Windows]](../images/windows.gif)
...
import java.util.Properties;
import org.omg.CORBA.ORB;
...
Properties props = new Properties();
props.put("org.omg.CORBA.ORBClass", "com.ibm.CORBA.iiop.ORB");
props.put("com.ibm.CORBA.ORBInitRef.NameService",
"corbaloc:iiop:myhost.mycompany.com:2809/NameService");
props.put("com.ibm.CORBA.ORBInitRef.NameServiceServerRoot",
"corbaloc:iiop:myhost.mycompany.com:2809/NameServiceServerRoot");
ORB _orb = ORB.init((String[])null, props);
...
![[z/OS]](../images/ngzos.gif)
...
import java.util.Properties;
import org.omg.CORBA.ORB;
...
Properties props = new Properties();
props.put("org.omg.CORBA.ORBClass","com.ibm.ws390.orb.ORB");
props.put("com.ibm.CORBA.ORBInitRef.NameService",
"corbaloc:iiop:myhost.mycompany.com:2809/NameService");
props.put("com.ibm.CORBA.ORBInitRef.NameServiceServerRoot",
"corbaloc:iiop:myhost.mycompany.com:2809/NameServiceServerRoot");
ORB _orb = ORB.init((String[])null, props);
...
![[IBM i]](../images/iseries.gif)
...
import java.util.Properties;
import org.omg.CORBA.ORB;
...
Properties props = new Properties();
props.put("org.omg.CORBA.ORBClass","com.ibm.ws390.orb.ORB");
props.put("com.ibm.CORBA.ORBInitRef.NameService",
"corbaloc:iiop:myhost.mycompany.com:2809/NameService");
props.put("com.ibm.CORBA.ORBInitRef.NameServiceServerRoot",
"corbaloc:iiop:myhost.mycompany.com:2809/NameServiceServerRoot");
ORB _orb = ORB.init((String[])null, props);
...
获取对服务器 ORB 的引用
在服务器进程中运行的 CosNaming 客户机可以用 java: 名称上的 JNID 查找获取对服务器 ORB 的引用,如下所示:
...
import javax.naming.Context;
import javax.naming.InitialContext;
import org.omg.CORBA.ORB;
...
Context initialContext = new InitialContext();
ORB orb = (ORB) initialContext.lookup("java:comp/ORB");
...
使用 ORB 引用获取初始命名引用
可以用两种基本方法获取初始 CosNaming 上下文。这两种方法都调用 ORB 方法调用。第一种方法是用初始引用键调用 ORB 的 resolve_initial_references。要让此调用起效,必须用该键的初始引用初始化 ORB。另一种方法是调用 ORB 的 string_to_object 方法,该方法在具有引导服务器的主机和端口的 CORBA 对象 URL 中传递的。下面的示例说明这两种方法。
调用 resolve_initial_references
一旦获取 ORB 引用,就调用 ORB 的 resolve_initial_references 方法来获取对初始上下文的引用。下面的代码示例调用 ORB 引用的 resolve_initial_reference。
...
import org.omg.CORBA.ORB;
import org.omg.CosNaming.NamingContextExt;
import org.omg.CosNaming.NamingContextExtHelper;
...
// Obtain ORB reference as shown in examples earlier in this section
...
org.omg.CORBA.Object obj = _orb.resolve_initial_references("NameService");
NamingContextExt initCtx = NamingContextExtHelper.narrow(obj);
...
注意,键 NameService 传递给 resolve_initial_references 方法。其他初始上下文键在产品服务器中注册。例如,可以使用 NameServiceServerRoot 获取对引导名称服务器中的服务器根上下文的引用。有关服务器 ORB 中注册的初始上下文的更多信息,请参阅初始上下文支持的相关主题。
用 CORBA 对象 URL 调用 string_to_object
您可以使用遵从 INS 的 ORB 获取初始上下文,即使 ORB 不是用任何初始引用或引导属性初始化的,或者如果那些属性设置适用于不同于您要从中获取初始上下文的名称服务器的服务器也是如此。要通过显式地指定引导名称服务器获取初始上下文,调用 ORB 的 string_to_object 方法,该方法在包含引导服务器主机和端口的 CORBA 对象 URL 中传递。
下面示例中的代码对现有 ORB 引用调用 string_to_object 方法,同时传递识别期望的初始上下文的 CORBA 对象 URL。
...
import org.omg.CORBA.ORB;
import org.omg.CosNaming.NamingContextExt;
import org.omg.CosNaming.NamingContextExtHelper;
...
// Obtain ORB reference as shown in examples earlier in this section
...
org.omg.CORBA.Object obj =
orb.string_to_object("corbaloc:iiop:myhost.mycompany.com:2809/NameService");
NamingContextExt initCtx = NamingContextExtHelper.narrow(obj);
...
注意在 corbaloc URL 中使用键 NameService。其他初始上下文键在产品服务器中注册。例如,您可以使用 NameServiceServerRoot 获取对引导名称服务器中的服务器根上下文的引用。
使用现有 ORB 并使用 CORBA 对象 URL 调用 string_to_object
CORBA 对象 URL 可以包含多个引导服务器地址。尝试从服务器集群获取初始上下文时,使用此功能。您可以为 URL 中集群中的所有服务器指定引导服务器地址。如果至少有一个服务器在运行,那么消除单点故障,此操作将会成功。不保证将以地址列表中列出的任何特定顺序进行处理。例如,即使列表中的第一个引导服务器是可供使用的,还是可以使用第二个引导服务器地址获取初始上下文。以下是具有多个地址的 corbaloc URL 的示例。
...
import org.omg.CORBA.ORB;
import org.omg.CosNaming.NamingContextExt;
import org.omg.CosNaming.NamingContextExtHelper;
...
// Assume orb is an existing ORB instance
org.omg.CORBA.Object obj = orb.string_to_object(
"corbaloc::myhost1:9810,:myhost1:9811,:myhost2:9810/NameService");
NamingContextExt initCtx = NamingContextExtHelper.narrow(obj);
...