对象请求代理服务的客户机端编程提示

每个因特网 InterORB 协议 (IIOP) 请求和响应交换都由客户机端 ORB 和服务器端 ORB 组成。 对使用 IIOP 的任何应用程序进行正确编程,以便与客户机端对象请求代理 (ORB) 通信很重要。

以下技巧有助于您确保对使用 IIOP 来处理请求和响应交换的应用程序进行正确编程,以便与客户机端对象请求代理 (ORB) 通信。

初始引用服务的解决方案

客户机应用程序可以使用 ORBInitRef 和ORBDefaultInitRef 属性来配置 ORB 服务用来查找服务(如命名)的网络位置。 设置时,这些属性包含在用于初始化 ORB 的参数中,如下例中所述:
org.omg.CORBA.ORB.init(java.lang.String[] args, 
                       java.util.Properties props)

您可以用客户机代码或命令行自变量设置这些属性。 可以通过使用多个 ORBInitRef 属性设置来指定多个服务位置(每个服务使用一个位置),但只能指定一个 ORBDefaultInitRef 值。 有关 ORB 用于查找服务的这两个属性和优先顺序的更多信息,请参阅 CORBA/IIOP 规范。

用客户机代码分别进行设置的这些属性是 com.ibm.CORBA.ORBInitRef.service_name 和 com.ibm.CORBA.ORBDefaultInitRef。 例如,要指定命名服务 (NameService) 位于端口 2809 上的 sample.server.com,那么要将 com.ibm.CORBA.ORBInitRef.NameService 属性设置为 corbaloc::sample.server.com:2809/NameService

对于命令行自变量设置,这些属性分别为 -ORBInitRef 和 -ORBDefaultInitRef。 要找到先前指定的相同命名服务,请使用以下 Java™ 命令:

在为 ORB 支持的服务设置了这些属性后,Java Platform, Enterprise Edition (Java EE) 应用程序可以调用 ORB 上的 resolve_initial_references 功能(如 CORBA/IIOP 规范中的定义)来获取对给定服务的初始引用。

用于获取 ORB 实例的首选 API

对于 Java EE 应用程序,您可以使用以下任何一种方法。 然而,强烈建议您使用 Java 命名和目录接口 (JNDI) 方法来确保在整个客户端应用程序中使用相同的 ORB 实例;这样可以避免在使用不同的 ORB 实例时可能出现的意外不一致。

JNDI 方法:对于 Java EE 应用程序(包括企业 Bean、Java EE 客户机和 servlet),您可以通过创建 JNDI InitialContext 对象和查询 java:comp/ORB 名称下的 ORB 来获取 ORB 实例,如以下示例所述:
javax.naming.Context ctx = new javax.naming.InitialContext();
org.omg.CORBA.ORB orb = 
   (org.omg.CORBA.ORB)javax.rmi.PortableRemoteObject.narrow(ctx.lookup("java:comp/ORB"), 
                                                            org.omg.CORBA.ORB.class);
使用JNDI获取的ORB实例是一个单例对象,由所有Java EE在同一个 Java 虚拟机进程中运行的组件。
避免麻烦:如果您想利用应用程序内的 WLM 功能和集群故障转移,则必须使用 JNDI 方法。 有关如何获取服务器集群中的 InitialContext 的信息,请参阅使用包含多个名称服务器地址的 CORBA 对象 URL 的示例(位于“通过设置提供程序 URL 属性获取初始上下文”主题中)。
CORBA 方法: 因为瘦客户机应用程序不运行在 Java EE 容器中,所以它们不能使用 JNDI 接口查询 ORB。 在这种情况下,您可以使用 CORBA 编程接口获取 ORB 实例,按如下所示:
java.util.Properties props = new java.util.Properties();
java.lang.String[] args = new java.lang.String[0];
org.omg.CORBA.ORB orb = org.omg.CORBA.ORB.init(args, props);

与 JNDI 方法相比,CORBA 规范要求在每次调用 ORB.init 方法时创建新的 ORB 实例。 如果需要更改 ORB 缺省设置,那么可以将 ORB 属性设置添加到在 ORB.init 方法调用中传递的 Properties 对象。

不推荐使用 com.ibm.ejs.oa.EJSORB.getORBinstance 方法,但该方法在此产品的前发行版中是支持的。

在 Java EE 应用程序组件中共享 ORB 实例时的 API 限制

由于性能原因,通常在 Java EE 应用程序中的组件间共享单个 ORB 实例才有意义。 根据 Java EE 规范 V1.3 的要求,所有 Web 和 EJB 容器都在 JNDI 名称空间中提供 ORB 实例 java:comp/ORB。 每个容器可以共享应用程序组件间的该实例,但不是必需共享。 对于应用程序组件间的正确的隔离,应用程序代码必须遵守以下限制:
  • 不要调用 ORB 关闭或销毁方法
  • 不要调用 org.omg.CORBA_2_3.ORB 方法 register_value_factory 或 unregister_value_factory

另外,不要在不同的 Java EE 应用程序中的应用程序组件之间共享 ORB 实例。

需要使用随附的 rmic 和 idlj IBM开发套件

本产品使用的 Java 运行时环境 (JRE) 包括伊德利工具。 您可以使用这些工具为 CORBA/IIOP 协议生成 Java 语言绑定。

在产品安装过程中,工具安装在应用程序服务器根目录/java/ibm_bin目录。 Java 开发工具包中包含的这些工具的版本$JAVA_HOME/bin目录之外的目录IBM®随本产品安装的开发工具包与本产品不兼容。

当您安装此产品时,应用程序服务器根目录/java/ibm_bin目录包含在 $PATH 搜索顺序中,以便使用由提供的 rmic 和 idlj 脚本IBM 。 因为脚本在应用程序服务器根目录/java/ibm_bin目录而不是 JRE 标准应用程序服务器根目录/java/bin目录,在对未提供的 JRE 进行维护时,您不太可能覆盖它们IBM 。

除 rmic 和 idlj 工具之外,JRE 还包括接口定义语言 (IDL) 文件。 这些文件基于对象管理组 (OMG) 定义的内容,并可以被应用程序(它们需要所选 ORB 接口的 IDL 定义)使用。 文件放置在应用程序服务器根目录/java/ibm_lib目录。

在使用 rmic 或 idlj 工具之前,请确保应用程序服务器根目录/java/ibm_bin目录包含在环境中正确的 PATH 变量搜索顺序中。 如果您的应用程序使用 IDL 文件应用程序服务器根目录/java/ibm_lib目录,还要确保该目录包含在 PATH 变量中。