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);
//通过ejb的JNDI 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_PRINCIPAL和Context.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());
}
}
}
4、EJB中调用其他的EJB(不同的EJB模块)
前提:被调用者实现了REMOTE接口
最简单的方法是按客户端程序(或者SERVLET)中调用EJB的方法。
分享到:
相关推荐
客户端(Local或Remote)访问EJB时,需要使用JNDI(Java Naming and Directory Interface)查找EJB的引用,并通过该引用调用方法。对于Local访问,可以直接注入bean实例;对于Remote访问,需要使用`InitialContext`...
Tomcat下web工程调用JBOSS部署的EJB项目 此源码包 包括local本地调用及remote远程调用 文档说明在http://blog.csdn.net/heardy/article/details/6906225
- Remote Method Invocation(RMI):这是EJB之间最基础的调用方式,允许一个EJB实例调用另一个EJB的远程接口方法。 - Local Interface:如果调用方和被调用的EJB在同一应用服务器内,可以使用本地接口,这样可以...
### EJB3+JPA开发总结 #### 一、EJB3概述 EJB3 (Enterprise JavaBeans 3) 是Java EE平台上的一个重要组件,它主要用于构建企业级应用程序中的业务逻辑层。相比于早期版本,EJB3进行了大量改进,简化了许多开发流程...
2. **Application Assembler (应用程序组装者)**:配置和部署EJB组件,以及定义容器如何管理这些组件。 3. **Container Provider (容器提供商)**:实现EJB容器并提供所需的基础设施服务。 #### 二、编写和部署第一...
EJB项目通常涉及实体Bean(Entity Beans)、会话Bean(Session Beans)和服务端接口(Local或Remote Interfaces)。本文将深入探讨EJB的基础配置和测试方法。 ### 一、EJB项目配置 1. **环境搭建**:首先,你需要...
- **本地方法调用(Local Method Invocation)**:当客户端和EJB在同一JVM上运行时,可以使用本地接口,提高性能。 - **JNDI查找(Java Naming and Directory Interface, JNDI)**:客户端通过JNDI查找服务定位器...
总结起来,WebLogic EJB的学习不仅包括EJB的基本概念和原理,还包括在WebLogic Server环境下如何部署、配置和优化EJB应用,以及如何利用EJB实现分布式、事务性、安全的企业级服务。这是一门涵盖广泛的技术,对于Java...
完成上述配置和编程后,EJB服务就可以通过Tuxedo在分布式环境中被调用,实现了两个系统的无缝协作。然而,这种集成方式需要谨慎操作,因为涉及到跨平台的通信,调试和问题排查可能会比较复杂。在实施时,建议遵循...
- **本地方法调用 (Local Method Invocation)**:当EJB和客户端在同一JVM中运行时,可以使用本地接口,无需网络开销,效率更高。 - **EJB 3.0引入的注解**:如`@EJB`,允许在类或方法上直接注入其他EJB,简化了...
### EJB 3.0 中文版教程知识点总结 #### 1. 教程适用人群与背景 - **目标读者**:本教程旨在为具备Java基础的初学者提供EJB 3.0的学习资料,无需预先学习EJB 2.0。 - **技术变迁**:随着EJB 3.0的发展,EJB 2.0的...
EJB实例工程代码是学习和实践EJB技术的重要资源,它包含了完整的工程结构以及调用原理,可以直接导入开发环境中使用。 在EJB工程中,主要包含以下几个关键概念: 1. **EJB组件**:EJB组件是实现了EJB规范的Java类...
EJB技术还涉及接口和实现的分离,通过远程接口(Remote Interface)和本地接口(Local Interface)使得客户端可以透明地调用bean的方法。此外,EJB 3.0引入了注解(Annotations),简化了bean的配置,使得开发者可以...
在EJB_TEST中,我们看到的是作者自编的一个EJB实例,这通常涉及到创建、部署以及运行EJB组件,以便展示其功能和工作原理。 **EJB的组成部分**: 1. **实体Bean (Entity Bean)**:代表业务数据,通常映射到数据库中...
初学者可以通过简单的示例来了解EJB3的基本概念和工作原理,如创建一个简单的无状态会话Bean并调用其方法。 **1.8 熟悉JBOSS的目录结构** 了解JBOSS的目录结构对于管理和部署EJB组件非常重要。通常包括部署目录、...
在这个压缩包中,你可以找到各种EJB调用的实例代码,这将有助于理解EJB之间的交互方式,以及如何在实际项目中部署和使用这些组件。通过研究这些代码,开发者能够深入理解Java企业级开发的核心概念,提高在大型分布式...
总结,EJB 2.0是Java EE中的重要组件,通过理解其核心概念、生命周期、接口以及部署流程,我们可以构建复杂的企业级应用。"一个完整的Helloworld"示例为初学者提供了一个很好的起点,帮助理解EJB的基本操作。在实践...
EJB(Enterprise JavaBeans)是Java EE(Enterprise Java Platform)平台的一部分,主要用于构建分布式、事务处理、多客户端支持以及安全的后端企业级应用。EJB3.0是EJB规范的一个重要版本,它引入了许多简化开发的...