`

EJB中local和remote的区别以及调用方法总结(转)

    博客分类:
  • EJB
阅读更多

local是本地接口,remote是远程接口。web层调用app层使用remote接口。session bean和entity bean之间调用使用的是local接口。不用说你也明白,remote接口对性能的影响很大。所以在程序设计的时候我们尽量用loacal接口,也就是facade模式。具体就是,web层调用app层的session bean,session bean在调用各个entity bean。就好比是打长途电话找5个人,你是准备给5个人分别通话(长途-remote)还是准备先和一人通话(长途-remote)然后在由这个人对另外4个(短途-local)分别通知?我想你会选择第二种情况(facade模式)。

local接口可以在与ejb同一个JVM环境中调用,但是不能对它进行远程调用,假设你的web容器与所需调用的ejb不在一台服务器上,或者不在同一个welogic server中时就不能调用local接口,在jndi查找的时候不能查找local home,而要查找remote home,也就是说需要实际进行RMI调用,而且必须提供Provider URL(例如t3://myserver:7001),而且他们返回给客户的对象也不一样,local home创建的是javax.ejb.EJBLocalObject类型,它没有继承Remote interface;而Remote home创建的是javax.ejb.EJBObject类型的,它扩展了Remote.实际上javax.ejb.EJBLocalObject型接口没有抛出RemoteException,因为对local类型接口的调用不是RMI,所以的对local接口的调用效率要高于对remote对象的调用,针对这点对EJB的设计提出以下建议:
1、如果你的ejb客户只可能存在于与ejb相同app server,或者说同一个JVM环境中时,你可以只生成local类型接口(包括EJBHome 与EJBObject),如果你需要在与EJB容器不同的JVM环境中调用你的EJB的话,你必须生成Remote类型的接口(包括EJBHome 与EJBObject);
2、在一般情况下建议两种类型的接口(包括EJBHome 与EJBObject)都生成,尤其是Session Bean,Entity Bean,可以只生成local类型的接口,如果想远程调用你的Entity Bean一般用Session Bean做代理。
3、如果你不是远程调用EJB的话,使用EJB时建议调用local接口,这样效率高,因为远程调用就意味着建立网络连接,效率必然不如local调用。
4、在jb7中设计EJB时,默认情况下只给你生成local类型接口,所以你需要在设计EJB时把interfaces设成:local/remote,这样的话你的EJB至少会有5个java文件

 

 

 

----------------------------------------------------------------------------------------------------------------------

1、      客户端程序中调用EJB
前提:EJB要实现了REMOTE接口
客户端调用的代码可以用EJB Test Client工具生成。自己写就是这个样子:

 


       String url="t3://localhost:7001";
     Properties prop=new Properties();
     prop.put(Context.PROVIDER_URL,url);
            prop.put(Context.INITIAL_CONTEXT_FACTORY,"weblogic.jndi.WLInitialContextFactory");
            prop.put(Context.SECURITY_PRINCIPAL, "
name");
         prop.put(Context.SECURITY_CREDENTIALS,"
code");
     Context
context =new InitialContext(prop);
  
//通过ejbJNDI name查找到EJBHome对象
Object ref = context.lookup("
ejb/com/J2EE/first/ejb/HelloHome ");   
   //
得到EJBHome
HelloHome trH=(HelloHome) PortableRemoteObject.narrow(obj,HelloHome.class);
   //
得到EJBObject
    DigestSession digestSession = digestSessionHome.create();

   Hello tr=trH.create();
   System.out.println(tr.hello());

   byte[] ret = digestSession.md5(temp.getBytes());//ejb
方法调用

 

注意:Context.SECURITY_PRINCIPALContext.SECURITY_CREDENTIALS是可选的,涉及到对ejb的操作的权限。

 

2、SERVLET中调用EJB
前提:被调用的EJB实现了REMOTE接口
Servlet中,调用的代码应该是这个样子:

 


    try {
      Context context = new InitialContext();
      Object ref = context.lookup("UserFacade");
      //look up jndi name and cast to Home interface
      UserFacadeHome userFacadeHome = (UserFacadeHome) PortableRemoteObject.
          narrow(ref, UserFacadeHome.class);
      UserFacade userFacade = userFacadeHome.create();
      userFacade.updateUser("002","
老二");    }
    catch (Exception ex) {
      ex.printStackTrace();
    }

 


跟客户端程序中调用EJB的差别是在Context的生成上,servlet中直接用
Context context = new InitialContext();
而客户端程序中是用
    Properties properties = new Properties();
    properties.put(Context.INITIAL_CONTEXT_FACTORY,"weblogic.jndi.WLInitialContextFactory");
    properties.put(Context.PROVIDER_URL, "t3://localhost:7001");

 

    Context context= new InitialContext(properties);

 

3、      EJB中调用其他的EJB(同一EJB模块)
前提:
(1)
被调用者实现了LOCAL接口,调用者则实现了REMOTE接口
(2)
调用者和被调用者应该在同一EJB模块打包文件(jar)
(3)
调用者的部署描述(ejb-jar.xml)中有关于Local ref的描述,如下所示:

 


    <session>
      <display-name>UserFacade</display-name>
      <ejb-name>UserFacade</ejb-name>
      <home>ejbtest.test.UserFacadeHome</home>
      <remote>ejbtest.test.UserFacade</remote>
      <ejb-class>ejbtest.test.UserFacadeBean</ejb-class>
      <session-type>Stateless</session-type>
      <transaction-type>Container</transaction-type>
      <ejb-local-ref>
        <ejb-ref-name>ejb/user</ejb-ref-name>
        <ejb-ref-type>Entity</ejb-ref-type>
        <local-home>ejbtest.test.UserHome</local-home>
        <local>ejbtest.test.User</local>
        <ejb-link>User</ejb-link>
      </ejb-local-ref>
    </session>

在调用者中,调用的程序代码应该是下面的样子:

 

package ejbtest.test;import javax.ejb.SessionBean;
import javax.ejb.SessionContext;
import javax.ejb.CreateException;

 

import javax.ejb.*;
import java.util.Properties;
import javax.naming.Context;
import javax.naming.InitialContext;
import java.rmi.RemoteException;

 

public class UserFacadeBean
    implements SessionBean {
SessionContext sessionContext;
private UserHome userHome;
private static Context context;

 

public void ejbCreate() throws CreateException {
}

 

public void ejbRemove() {
}

 

public void ejbActivate() {
}

 

public void ejbPassivate() {
}

 

public void setSessionContext(SessionContext sessionContext) {
    System.out.println("@@@@@@@@@@@@@@@@ UserFacadeBean.setSessionContext()");
    this.sessionContext = sessionContext;
    try {
      findUserHome();
    }
    catch (Exception e) {
      throw new EJBException(e.getMessage());
    }
}

 

private void findUserHome() throws Exception {
    final String ENTITY_NAME = "java:comp/env/ejb/user";

 

    context = new InitialContext();

 

    if (userHome == null) {
      try {
        Object object = context.lookup(ENTITY_NAME);
        userHome = (UserHome) object;
      }
      catch (Exception e) {
        throw new EJBException(e.getMessage());
      }
    }
}

 

public void addUser(String id, String name) throws RemoteException {
    try {
      User user = userHome.create(id);
      user.setName(name);
    }
    catch (Exception ex) {
      throw new RemoteException(ex.getMessage());
    }
}
}

 

4EJB中调用其他的EJB(不同的EJB模块)
前提:被调用者实现了REMOTE接口
最简单的方法是按客户端程序(或者SERVLET)中调用EJB的方法。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

分享到:
评论

相关推荐

    Local和Remote方式访问EJB

    客户端(Local或Remote)访问EJB时,需要使用JNDI(Java Naming and Directory Interface)查找EJB的引用,并通过该引用调用方法。对于Local访问,可以直接注入bean实例;对于Remote访问,需要使用`InitialContext`...

    Tomcat web工程 调用 JBOSS EJB local及remote源码

    Tomcat下web工程调用JBOSS部署的EJB项目 此源码包 包括local本地调用及remote远程调用 文档说明在http://blog.csdn.net/heardy/article/details/6906225

    各种EJB之间的调用示例

    - Remote Method Invocation(RMI):这是EJB之间最基础的调用方式,允许一个EJB实例调用另一个EJB的远程接口方法。 - Local Interface:如果调用方和被调用的EJB在同一应用服务器内,可以使用本地接口,这样可以...

    EJB3+JPA开发总结

    ### EJB3+JPA开发总结 #### 一、EJB3概述 EJB3 (Enterprise JavaBeans 3) 是Java EE平台上的一个重要组件,它主要用于构建企业级应用程序中的业务逻辑层。相比于早期版本,EJB3进行了大量改进,简化了许多开发流程...

    实战EJB 实战EJB 实战EJB

    2. **Application Assembler (应用程序组装者)**:配置和部署EJB组件,以及定义容器如何管理这些组件。 3. **Container Provider (容器提供商)**:实现EJB容器并提供所需的基础设施服务。 #### 二、编写和部署第一...

    EJB项目的基础配置和测试方法

    EJB项目通常涉及实体Bean(Entity Beans)、会话Bean(Session Beans)和服务端接口(Local或Remote Interfaces)。本文将深入探讨EJB的基础配置和测试方法。 ### 一、EJB项目配置 1. **环境搭建**:首先,你需要...

    各种EJB之间的调用示例.zip

    - **本地方法调用(Local Method Invocation)**:当客户端和EJB在同一JVM上运行时,可以使用本地接口,提高性能。 - **JNDI查找(Java Naming and Directory Interface, JNDI)**:客户端通过JNDI查找服务定位器...

    Weblogic Ejb 学习笔记

    总结起来,WebLogic EJB的学习不仅包括EJB的基本概念和原理,还包括在WebLogic Server环境下如何部署、配置和优化EJB应用,以及如何利用EJB实现分布式、事务性、安全的企业级服务。这是一门涵盖广泛的技术,对于Java...

    WTC暴露ejb服务说明

    完成上述配置和编程后,EJB服务就可以通过Tuxedo在分布式环境中被调用,实现了两个系统的无缝协作。然而,这种集成方式需要谨慎操作,因为涉及到跨平台的通信,调试和问题排查可能会比较复杂。在实施时,建议遵循...

    各种EJB之间的调用示例.7z

    - **本地方法调用 (Local Method Invocation)**:当EJB和客户端在同一JVM中运行时,可以使用本地接口,无需网络开销,效率更高。 - **EJB 3.0引入的注解**:如`@EJB`,允许在类或方法上直接注入其他EJB,简化了...

    EJB3.0中文 版

    ### EJB 3.0 中文版教程知识点总结 #### 1. 教程适用人群与背景 - **目标读者**:本教程旨在为具备Java基础的初学者提供EJB 3.0的学习资料,无需预先学习EJB 2.0。 - **技术变迁**:随着EJB 3.0的发展,EJB 2.0的...

    EJB实例工程代码

    EJB实例工程代码是学习和实践EJB技术的重要资源,它包含了完整的工程结构以及调用原理,可以直接导入开发环境中使用。 在EJB工程中,主要包含以下几个关键概念: 1. **EJB组件**:EJB组件是实现了EJB规范的Java类...

    EJB基础(学习EJB者必看)

    EJB技术还涉及接口和实现的分离,通过远程接口(Remote Interface)和本地接口(Local Interface)使得客户端可以透明地调用bean的方法。此外,EJB 3.0引入了注解(Annotations),简化了bean的配置,使得开发者可以...

    EJB_TEST自己编写的EJB例子

    在EJB_TEST中,我们看到的是作者自编的一个EJB实例,这通常涉及到创建、部署以及运行EJB组件,以便展示其功能和工作原理。 **EJB的组成部分**: 1. **实体Bean (Entity Bean)**:代表业务数据,通常映射到数据库中...

    EJB3.0中文文档

    初学者可以通过简单的示例来了解EJB3的基本概念和工作原理,如创建一个简单的无状态会话Bean并调用其方法。 **1.8 熟悉JBOSS的目录结构** 了解JBOSS的目录结构对于管理和部署EJB组件非常重要。通常包括部署目录、...

    基于Java的实例源码-各种EJB之间的调用示例.zip

    在这个压缩包中,你可以找到各种EJB调用的实例代码,这将有助于理解EJB之间的交互方式,以及如何在实际项目中部署和使用这些组件。通过研究这些代码,开发者能够深入理解Java企业级开发的核心概念,提高在大型分布式...

    EJB2.0一个完整的Helloworld

    总结,EJB 2.0是Java EE中的重要组件,通过理解其核心概念、生命周期、接口以及部署流程,我们可以构建复杂的企业级应用。"一个完整的Helloworld"示例为初学者提供了一个很好的起点,帮助理解EJB的基本操作。在实践...

    EJB3.0__EJB3.0

    EJB(Enterprise JavaBeans)是Java EE(Enterprise Java Platform)平台的一部分,主要用于构建分布式、事务处理、多客户端支持以及安全的后端企业级应用。EJB3.0是EJB规范的一个重要版本,它引入了许多简化开发的...

Global site tag (gtag.js) - Google Analytics