服务热线:13616026886

技术文档 欢迎使用技术文档,我们为你提供从新手到专业开发者的所有资源,你也可以通过它日益精进

位置:首页 > 技术文档 > JAVA > 新手入门 > 基础入门 > 查看文档

灵活使用ejb的本地和远程接口(三)


  jndi 绑定和源代码分析
  ejb 模块
  从 dualejbmodule01 开始。在 ejb deployment descriptor 编辑器面板中,选择 beans 选项卡,然后选择 dualentity,并且确保 websphere bindings 部分中的 jndi 名设置为 “ejb/dual/ejb/dualentityhome” 。保存所有的更改。首先,让我们研究 dualejbmodule02 项目中 dualsession ejb 的 ejb-jar.xml 的代码片断:
  ...
  
    uselocal
    java.lang.boolean
    true
  

  
    dotrace
    java.lang.boolean
    false
  

  
    ejb/dualentityremotehome
    entity
    dual.ejb.dualentityremotehome
    dual.ejb.dualentityremote
    dualejbmodule01.jar#dualentity
  

  
    ejb/dualentitylocalhome
    entity
    dual.ejb.dualentitylocalhome
    dual.ejb.dualentitylocal
    dualejbmodule01.jar#dualentity
  

  ...
  
  这里,第一个元素(具有名称“uselocal”)是用来控制 dualentity ejb 的本地接口的使用的。第二个条目(具有名称“dotrace”)准备只用于跟踪。已实现的跟踪功能是相当基本的,但是对于我们的目的来说足够了。 相应的 java 代码看起来像是下面这样的:
  
  public class dualsessionbean implements javax.ejb.sessionbean {
    private javax.ejb.sessioncontext mysessionctx;
    private boolean dotrace;
    private boolean uselocal;
    private dualentityremotehome entityremotehome;
    private dualentitylocalhome entitylocalhome;
  
    public void setsessioncontext(javax.ejb.sessioncontext ctx) {
     mysessionctx = ctx;
     try {
       context initctx = new initialcontext();
       boolean option = null;
       option = (boolean)initctx.lookup("java:comp/env/uselocal");
       uselocal = option.booleanvalue();
       option = (boolean)initctx.lookup("java:comp/env/dotrace");
       dotrace = option.booleanvalue();
       if (dotrace)
        system.out.println("dualsessionbean#setsessioncontext: uselocal="
           +uselocal);
       object homeobject = null;
       if (uselocal){
        homeobject = initctx.lookup("java:comp/env/ejb/dualentitylocalhome");
        entitylocalhome = (dualentitylocalhome)homeobject;
       } else {
        homeobject = initctx.lookup("java:comp/env/ejb/dualentityremotehome");
        entityremotehome = (dualentityremotehome)
        javax.rmi.portableremoteobject.narrow(homeobject,
           dualentityremotehome.class);
       }
     } catch(namingexception ne){
       // process exception here...
     }
    }
  ...
  
  在 java 代码中,ejb 环境变量是作为无状态会话 bean 对象的生命周期的类变量存储的。dualentity 的本地接口和 remote home interface 是通过引用访问的;这是首选的方式,并且遵守 ejb 2.0 规范。相对地,ejb-jar.xml 包含描述这些引用的 ejb-ref 和 ejb-local-ref 元素。打开 ejb deployment descriptor 编辑器,然后选择 beans 选项卡。确保 jndi 名设置为“ejb/dual/ejb/dualsessionhome”。然后转到 references 选项卡,确保对 dualentity 两个引用指向 jndi 名“ejb/dual/ejb/dualentityhome”。必要时可以更改这些值,然后保存所作的更改。
  
  web 模块
  dualwebmodule03project 标准的 j2ee web 部署描述符包含两个重要的代码片段。第一个指定该 servlet 的初始参数:
  
  ...
   
   uselocal
   true
   

   
   dotrace
   true
   

       
     jndiproviderurl
     iiop://localhost:2809
   

   
     jndinameonserver
     ejb/dual/ejb/dualsessionhome
   

   
     initialctxfactoryclassname
     com.ibm.ejs.ns.jndi.cninitialcontextfactory
   

  -->
  ...
  
  上面的代码在意义上类似于前面讨论的 ejb 环境参数。注释掉的 web 部署描述符部分后面将需要用于分离容器(separate containers)拓扑。the web deployment descriptor section that is commented out will be needed later for the separate containers topology. 如果这三个附加的参数没有注释掉,在与此体系结构有关的逻辑将通过该 servlet 的 init() 方法进行调用。(稍后将对此进行更多的介绍。)第二个代码片段描述了需要用来建立 servlet 与 ejb 通信的引用:
  
  ...
  
   ejb/dualsessionremotehome
   session
   dual.ejb.dualsessionremotehome
   dual.ejb.dualsessionremote
   dualejbmodule02.jar#dualsession
  

  
   ejb/dualsessionlocalhome
   session
   dual.ejb.dualsessionlocalhome
   dual.ejb.dualsessionlocal
   dualejbmodule02.jar#dualsession
  

  ...
  
  相对地,dualservlet 的源代码包含该 servlet 的 init() 方法中的处理逻辑。下面是与处理 ejb 引用有关的代码片段:
  
  ...
  final string jndi_name_local = "java:comp/env/ejb/dualsessionlocalhome";
  final string jndi_name_remote = "java:comp/env/ejb/dualsessionremotehome";
  ...
    if (uselocal) {
     initctx = new initialcontext();
     homeobject = initctx.lookup(jndi_name_local);
     sessionlocalhome = (dualsessionlocalhome) homeobject;
    } else {
     homeobject = initctx.lookup(jndi_name_remote);
     sessionremotehome =
       (dualsessionremotehome) portableremoteobject.narrow(
       homeobject,
       dualsessionremotehome.class);
    }
  ...
  
  (下载的源代码中的初始参数处理逻辑实际上更复杂,因为它还处理分离容器(separate containers)拓扑。)可以在 dualwebmodule03 的 web deployment descriptor 编辑器窗格中,首选选中 dualservlet 的所有设置(包括 initialization 部分在内),然后转到 references 选项卡,选中 ejb 和 ejb local 这两个子选项卡。两个引用应该指向 websphere bindings 部分中的jndi 名“ejb/dual/ejb/dualsessionhome”。
  
  项目依赖性总结
  现在我们基本上完成了这些模块,让我们再次回顾一下所有项目(包括 ear 在内)的依赖性:
  
  ?dualjavamodule00 没有依赖性。
  
  ?dualejbmodule01 没有依赖性。
  
  ?dualejbmodule02 在“java build path”、“java jar dependencies”和“project references”?设置中必须有 dualjavamodule00、dualejbmodule01 项目。
  
  ?dualwebmodule03 在“java build path”、“project references”和“web library projects”设置中必须有 dualjavamodule00、dualejbmodule02 项目。
  
  ?dualearforejbcontainer 在“project references”设置中必须有 dualjavamodule00、dualejbmodule01、dualejbmodule02;ear 部署描述符必须有指向 ejb 模块和 java 模块的引用。
  
  ?dualearforallinone 必须有指向所有模

扫描关注微信公众号