只要war和ejb部署在同一服务器上,可以通过local interface访问ejb

解决方案 »

  1.   

    当然ejb之间互访也可以用local interface
      

  2.   

    所谓local,当然是本地了,只要部署在同一服务器上,web层或者ejb都可以通过local interface访问其它ejb
      

  3.   

    local接口比远程接口效率高多了 建议多用,切忌滥用!
      

  4.   

    可以,但是我想问一下,本地调用用到jdni,既然用到了jdni不就用到了远程调用了吗?何来本地调用?
      

  5.   

    正版解释是不清楚,远程访问是可以让可以让EJB可以以组件形式发布在不同机器上,版本更新的时候只要更新特定组件就行了,只需更新服务器端,而不必更新客户端。
    但当EJB不是主要以组件形式提供给使用者,而是发布在同一机器上时,如果通过本地接口访问,实际上减少了网络通讯开销,所以说本地接口效率比远程接口高,也是这个原因,当然,这是以降低可移植性为代价的.
      

  6.   

    context 怎么设置,能不能给段代码?
      

  7.   

    在web.xml中配置对EJB的本地接口和工厂的引用:
      <ejb-local-ref>
        <description>AuthenticateCenter</description>
        <ejb-ref-name>local/AuthCenter</ejb-ref-name>
        <ejb-ref-type>Session</ejb-ref-type>
        <local-home>com.norteksoft.erm.authenticate.AuthenticateCenterLocalHome</local-home>
        <local>com.norteksoft.erm.authenticate.AuthenticateCenterLocal</local>
        <ejb-link>EJBUser.jar#AuthenticateCenter</ejb-link>
      </ejb-local-ref>
    然后就可以在servlet、javabean、struts的plugin里面查找并缓存其接口或工厂:
    public class EJBPlugIn
        implements PlugIn {
      private static ModuleConfig config = null;
      private static AuthenticateCenterLocalHome authHome = null;  public void init(ActionServlet servlet, ModuleConfig config) throws
          ServletException {
        this.config = config;
        try {
          InitialContext ctx = new InitialContext();
          Object obj = ctx.lookup("java:comp/env/local/AuthCenter");
          authHome = (AuthenticateCenterLocalHome) obj;
        }
        catch (Exception e) {
          e.printStackTrace();
        }  public static AuthenticateCenterLocal getAuthCenter() throws CreateException {
        return authHome.create();
      }}
    struts-config.xml配置该plugin:
    <plug-in className="com.norteksoft.util.pool.EJBPoolPlugIn" />这样,你的web模块里随处都可以通过获得EJB的本地接口,调他的用方法了:
    EJBPlugIn.getAuthCenter().callAFun;
      

  8.   

    以上代码在jboss3.2.x中运行正常,需要struts1.1、ejb2.0
      

  9.   

    lydong(西瓜水) 所谓local,当然是本地了,只要部署在同一服务器上,web层或者ejb都可以通过local interface访问其它ejb
    -------------------------------------------应该是同一个JVM中,可以使用本地接口因为很多应用服务器可以在同一台中启动多个应用实例来共同向外提供服务(比如WEBSPHERE),他们是不同的JVM,如果要在这些JVM间,就必须使用远程接口
      

  10.   

    to daquan198163(大权):
    <ejb-link>EJBUser.jar#AuthenticateCenter</ejb-link>
    web.xml中的ejb-link是什么意思呢?是不是可以不配置啊?
    谢谢!
      

  11.   

    如果要用本地接口就要用<ejb-link>绑定EJB,用远程接口可以不用它而是在jboss.xml里面配置JNDI绑定
      

  12.   

    在同一JVM中可以使用本地接口,JNDI只是查找资源,这个查找过程是remote的机制,但调用的时候是local的机制,这个由容器来处理。
      

  13.   

    daquan198163(大权) 
    应该是同一个JVM中,可以使用本地接口因为很多应用服务器可以在同一台中启动多个应用实例来共同向外提供服务(比如WEBSPHERE),他们是不同的JVM,如果要在这些JVM间,就必须使用远程接口——————————————————————————————
    同意你的说法,但是你没有理解我的服务器的含义。在WAS主可控台应用程序发布过程中,有一个步骤是“映射模块到应用程序服务器”,在其中就非常明确的提到:一个实例,对于WAS而言,就是一个服务器,所以有
    WebSphere:cell
      

  14.   

    续上:
    WebSphere:cell=appserver1,node=appserver1,server=server1
    WebSphere:cell=appserver1,node=appserver1,server=server2这个server1和server2的区别,就是一台机器上的两个实例(服务器)
    既然实例被当作服务器,自然没有了JVM的辨别,不过对于"很多应用服务器可以在同一台中启动多个应用实例来共同向外提供服务(比如WEBSPHERE)",咱是没经历过,因为咱针对的客户太专业性,特定的客户群~~呵呵
    要是有那种一台机器开多个实例的人确实要注意了,毕竟Remote接口是为了方便部署和访问的,选用local要注意发布的实例位置。