| 最佳实践:用 java:comp 来定位 ejb 并提高应用程序的可移植性 | ![]() |
英文原文 | ![]() |
![]() |
|||
![]() |
![]() |
读者:管理员,体系结构设计师,开发者 摘要如果您把同一个 j2ee 应用程序部署到多个应用程序服务器上,而这些应用程序服务器共享一个 jndi 名称空间,那么,由于名称空间中的 jndi 名称必须是唯一的,这样做将会出现问题。部署到 websphere application server 环境中的 j2ee 应用程序,应该使用 java:comp/env 环境命名上下文(environment naming context(enc))来查找 ejb,而不是使用 jndi 名称来查找。有了这个命名上下文,就可以避免发生冲突,应用程序的可移植性也将好得多。 推荐方案背景开发和部署按照 ejb 1.0 规范级别编写的 ejb,困难之一是处理 ejb home 的 jndi 名称。例如,有很多代码写成像下面的代码片段(取自会话 bean)那样,试图查找 com.ibm.wsc.bean2 ejb 的 home: context myinitctx = new initialcontext();object result = myinitctx.lookup("com/ibm/wsc/bean2home");com.ibm.wsc.bean2home thebean2home =(com.ibm.wsc.bean2home)javax.rmi.portableremote.narrow(result,com.ibm.wsc.bean2home.class);
这一技术在 java 开发环境(java development tooling,jdt)中能工作得很好,在应用程序的部署阶段似乎也不出什么问题。只要看一下上面的代码,就可以确定在名称空间中赋给 bean2home 的 jndi 名称,因为这个名称就是 ejb home 接口名称。编码约定就跟 ejb 类名被用来构造定位 home 的代码那样相当简单。
ejb 的命名模式已经开发,以硬编码的方式把 jndi 名称编写到 java 源代码中是问题的真正起因。我们需要这样一种能力,不必根据部署了 ejb 的服务器修改代码就能够提供特定于运行时的信息。结果是创建并实现一个模式,它利用 resourcebundle 或 property 文件提供运行时信息,如以下代码片段所示: resourcebundle myrb = resourcebundle.getbundle("serverprops");string mybean2homejndiname = myrb.getstring("bean2homename")context myinitctx = new initialcontext();object result = myinitctx.lookup(mybean2homejndiname);com.ibm.wsc.bean2home thebean2home =(com.ibm.wsc.bean2home)javax.rmi.portableremote.narrow(result,com.ibm.wsc.bean2home.class);
这一技术的全部要求就是为 wsqasv 服务器创建一个唯一的名为 serverprops.properties 的 .properties 文件,wsqasv 服务器的这个文件包含有类似下面的内容:bean2homename=wsqasv/com/ibm/wsc/bean2home ejb 1.1 解决方案幸运的是,ejb 1.1 规范引入了 jndi 增强功能,特别是环境命名上下文(enc)以及关于如何“找到” ejb、资源和特定于应用程序的环境变量的强烈推荐的做法。要了解详细信息,请参阅 ejb 1.1 规范的第 14 章和 j2ee 1.2 规范的第 5 章。以下代码片段使用所推荐的 java:comp/env 构造来查找 bean2home: context myinitctx = new initialcontext();object result = myinitctx.lookup("java:comp/env/ejb/bean2home");com.ibm.wsc.bean2home thebean2home =(com.ibm.wsc.bean2home) javax.rmi.portableremote.narrow(result,com.ibm.wsc.bean2home.class);
如何把“java:comp/env/ejb/bean2home”字符串和驻留在某台特定服务器中的 bean2home 的 jndi 名称关联起来,这项工作留给应用程序的装配者和部署者去做。应用程序开发者既不知道也不关心 bean2home 的 jndi 名称。 <ejb-ref> <ejb-ref-name>ejb/bean2home</ejb-ref-name> <ejb-ref-type>entity</ejb-ref-type> <home>com.ibm.wsc.bean2home</home> <remote>com.ibm.wsc.bean2</remote> <ejb-link>bean2</ejb-link></ejb-ref>
.xml 文件的内容通常由开发工具(即 websphere studio application developer)或装配工具(即应用程序装配工具(application assembly tool(aat)))构建和验证,不要求手工构造。请注意,没有给出 jndi 名称,只有一条声明,表明这个 ejb(或 servlet)将查找一个给定类型的 ejb home,并且该 ejb home 驻留在这个 j2ee 应用程序包即 .ear 文件中。(如果省略了 ejb-link 描述符,servlet 或 ejb 就可以查找并使用驻留在 jndi 名称空间中具有这一 bean 类型的任何服务器中所驻留的 bean2home。)实际上,应用程序装配者并不知道也不关心 bean2home 的 jndi 名称。jndi 名称留给部署者指定,其限制条件是,不论 j2ee 应用程序被部署到什么服务器中,bean2home 都必须驻留在该 j2ee 应用程序中。
要点是:
这一技术大大增强了 ejb 的可移植性。很容易就可以部署应用程序,而不必为实际的 jndi 名称劳心费神。可以从一个 j2ee 应用程序抽取出 ejb,然后很容易就可以将它集成到另一个 j2ee 应用程序中。
用于 websphere for z/os 的 systems management administration 工具允许部署者指定特选的 jndi 名称,如果部署者选择这样做,或者应用程序要求这样做的话。当不使用 java:comp/env 技术进行 lookup( ) 的时候就会出现这种情况。更为重要的是,该管理工具允许部署者指定一个系统生成的名称,这样生成的名称必定是唯一的。名称的格式如下:<sysplex_name>/<server_name>/<application_name>/<module_name>/<component_name>/<class_name> 备选方案使用 java:comp/env 的唯一备选方案是继续使用以前讨论的 ejb 1.0 技术。尽管该技术仍然行得通,但使用前面推荐的方案可以解决许多技术问题。 参考资料
作者简介
|

