`
leon.s.kennedy
  • 浏览: 110520 次
  • 性别: Icon_minigender_2
  • 来自: 北京
社区版块
存档分类
最新评论

开发具有本地接口的无状态session bean

    博客分类:
  • ejb3
 
阅读更多

 

当通过远程接口调用EJB时
首先客户端需要与ejb建立起socket通信,在通信管道上他们之间需要来回发送IIOP协议消息,因为数据要在网络进行传输,存放数据的java对象必须要进行序列化
开发具有本地接口的无状态session <wbr>bean
在这个过程中,有网络通信的开销、协议解析的开销、对象序列化的开销。因为ejb是分布式技术,它允许客户端与ejb应用在不同一机器上面,所以这些性能开销也是必然的


但是在实际生产中,不可避免这种情况:客户端与EJB应用运行在同一台机器上的同一个jboss中
那么这个时候客户端是否还有必要跟ejb之间走上面的网络通信呢?
这个时候的客户端与ejb是在同一个jvm内,他们之间完全可以通过内存进行交互,如果如此,完全可以避免上面流程的性能开销,所以引入了——本地接口

 

通过本地接口调用ejb,直接在内存交互,这样可以避免因网络通信所造成的各种性能开销,但有一点需要注意:
只有客户端与EJB应用都在同一个JVM内运行的时候,才能调用本地接口,否则只能调用远程接口
什么情况下客户端与EJB应用是在同一个JVM?
只要客户端与EJB发布在同一个jboss内,就可以认为他们在同一个JVM

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

在原有的HelloWorld项目中,修改HelloWorldBean.java
@Remote(HelloWorld.class)
修改为@Local(HelloWorld.class) 就可完成本地接口
具有本地接口的无状态bean已经被开发

运行ANT的deploy将EJB部署到jboss中,通过控制台可以看到ejb已经成功部署


当EJB部署成功,jboss会为这个本地接口,生成出一个JNDI名称
开发EJB的客户端http://blog.sina.com.cn/s/blog_8020e411010123yl.html博文中讲述了 jboss生成JNDI默认命名规则,这里不再赘述

这里生成的JNDI名称为:HelloWorldBean/local
在客户端,通过该JNDI名称,使用本地接口,访问EJB

 

此时会报错,原因是客户端和EJB不在同一个JVM内

 

新建一个web项目,将其部署在jboss下,使客户端与EJB在同一个jboss中,方可使用本地接口

新建一个Test.jsp,将原EJBClient客户端代码,复制进来

并讲类引入进来(<%@ page import="java.naming.*"%>)

此时 HelloWorld helloWorld = (HelloWorld)cts.lookup("HelloWorldBean/local");的HelloWorld类不存在,由于不是同一个项目,所以需要将刚才的EJBClient的java Project导入进这个Web Project中

选中这个EJBClient的Web项目,右键,Properties

开发具有本地接口的无状态session <wbr>bean

选择刚才的EJB java Project,点OK

在Test.jsp页面,完整的导入:
<%@ page import="javax.naming.*,com.test.ejb3.HelloWorld" %>
<body>
    <%
     try{
   InitialContext cts = new InitialContext();
   //根据EJB的JNDI名称去寻找与这个名称绑定的EJB的待承担对象
   //如果找到了,就会返回给客户端
   //在客户端用接口文件去引用这个待承担对象
   HelloWorld helloWorld = (HelloWorld)cts.lookup("HelloWorldBean/local");
   out.println(helloWorld.getClass().getName()); //$Proxy3
   //通过这个对象,调用EJB业务方法
   out.println(helloWorld.sayHello("本地人")); //hello说:你好,世界!
  }catch(NamingException e){
   out.println(e.getMessage());
  }
     %>
  </body>

此时客户端应用已经开发完成,然后导出war文件

开发具有本地接口的无状态session <wbr>bean

将war文件,拷贝到jboss的发布目录下进行发布

 

如果:

InitialContext cts = new InitialContext();

为Application Server指定了JNDI名称,那此程序只能运行在这个Application Server中

如不写参数,则其构造函数自动寻找jndi的上下文信息,自动与其绑定

 

要注意:在EJBClient的Web项目下,引用的HelloWorld接口,并没有将它的class文件放入该web项目的classpath下

原因是:当加载到HelloWorld类时,没有找到它时,由于引用了HelloWorld JavaProject项目,EJB类加载器就会去它的classpath中寻找

所以,当WEB应用和EJB应用部署在同一个JVM内时,并不需要在客户端应用里面,放入EJB的接口类

如果将EJB接口类放入进客户端classpath中,有时会导致类型出图问题

 

企业中,很有可能客户端和EJB是部署在同一个JBOSS中,也可能部署在不同机器上

考虑到这两点,就会选用远程接口或本地接口

 

返回到刚才的HelloWorld java Project程序:

新建一个接口:

//继承HelloWorld的业务方法
public interface HelloWorldLocal extends HelloWorld{

}

 

修改实现的bean:

开发具有本地接口的无状态session <wbr>bean
让他既有本地接口,也有远程接口

优先调用本地接口

这样就可以使:当客户端与EJB在同一个JBOSS中,使用本地接口

客户端与EJB不在同一个JBOSS中,则使用远程接口

 

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

try{
   InitialContext cts = new InitialContext();
   HelloWorld helloWorld = (HelloWorld)cts.lookup("HelloWorldBean/remote");//使用远程接口
   System.out.println(helloWorld.getClass().getName()); //$Proxy3
   System.out.println(helloWorld.sayHello("明明")); //明明说:你好,世界!
  }catch(NamingException e){
   System.out.println(e.getMessage());
  }

EJB与客户端在同一个jboss中,也可用远程接口访问

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

<body>
    <%
     try{
   InitialContext cts = new InitialContext();
   HelloWorldLocal helloWorld = (HelloWorldLocal)cts.lookup("HelloWorldBean/local"); //使用本地接口
   out.println(helloWorld.getClass().getName()); //$Proxy3
   out.println(helloWorld.sayHello("本地人")); //本地人说:你好,世界!
  }catch(NamingException e){
   out.println(e.getMessage());
  }
     %>
  </body>

在Web客户端与EJB使用同一个jboss,可用本地接口

分享到:
评论

相关推荐

    EJB3.0无状态SessionBean例子

    总结,EJB3.0无状态SessionBean的例子展示了如何利用注解简化开发流程,以及如何通过本地和远程接口进行组件间的通信。理解并掌握这些概念对于构建可扩展、健壮的企业级Java应用至关重要。通过学习这个示例,开发者...

    ejb3 第6讲--开发具有本地接口的无状态bean

    在本教程中,我们将深入探讨EJB(Enterprise JavaBeans)3中的本地接口和无状态bean的开发。EJB是Java企业级应用的核心组件,用于构建可扩展、安全且可靠的分布式系统。EJB 3是其重要的一个版本,引入了诸多简化开发...

    weblogic部署EJB2.0 实现本地接口的SessionBean

    在本文中,我们将深入探讨如何在WebLogic环境中部署EJB 2.0,特别是实现本地接口的Session Bean。 EJB 2.0是Java EE早期版本中的组件模型,用于构建可复用、分布式的企业级服务。它定义了三种主要类型的Bean:...

    EJB2 SessionBean

    - 实现无状态Session Bean时,不需要实现 javax.ejb.SessionSynchronization 接口,因为它们没有会话状态需要同步。 2. **有状态Session Bean** - 有状态Session Bean存储了客户端的上下文信息,允许在多个方法...

    ejb入门录像 sessionBean

    【ejb入门录像 sessionBean】是针对企业级Java应用(Enterprise JavaBeans,简称EJB)技术的初学者设计的一段教学视频。EJB是Java EE(Java Platform, Enterprise Edition)框架的重要组成部分,它提供了一种标准的...

    Jboss下开发ejb应用之一会话bean的应用

    3. 注解配置:使用注解如`@Remote`或`@Local`定义远程或本地接口,`@EJB`注解注入其他依赖的Bean。 五、部署和测试 1. 配置Jboss:在Jboss的部署目录下,添加EJB JAR文件或包含EJB的WAR/EAR文件。 2. 远程调用:...

    eclipse + JBoss 5 + EJB3开发指南

    在开始编写无状态的SessionBean之前,首先需要确保开发环境已经正确配置。以下是所需的主要组件: 1. **Eclipse**:版本3.4.2,推荐使用针对Java EE开发者的Eclipse版本。 2. **JBoss**:版本5.0.1,可以从官方网站...

    EJB3.1技术培训

    - 当开发一个只有Local接口的无状态会话Bean时,需要使用`@Local`注解声明接口是本地接口。 - 当开发一个只有Remote接口的无状态会话Bean时,需要使用`@Remote`注解声明接口是远程接口。 - 如果既不使用`@Local`...

    EJB3.0简介

    根据其对会话状态的处理方式,会话Bean主要分为两种类型:有状态会话Bean(Stateful Session Bean)和无状态会话Bean(Stateless Session Bean)。 ##### 无状态会话Bean(Stateless Session Bean) 无状态会话...

    java面试试题大全

    - 创建方法:用于生成 Bean 实例,无状态 Session Bean 有一个无参的创建方法,有状态 Session Bean 至少有一个,Entity Bean 可以有多个。 - Finder 方法:特定于 Entity Bean,根据指定条件在数据库中查找实体。...

    Java面试题强化版

    - 创建方法:无状态Session Bean有一个无参的创建方法,有状态Session Bean至少有一个,Entity Bean可有0至多个。 - Finder方法:针对Entity Bean,用于在数据库中查找匹配的持久性数据。 - Home方法:仅适用于...

    ebj设计模式

    无状态Session Bean不保存任何客户端的会话信息,每个请求都被视为独立的。这种模式适用于处理计算密集型任务,而非存储用户状态。在EJB中,可以使用@Stateless注解定义无状态Session Bean。 3. **有状态 Session ...

    Jboss EJB3.0教程

    - 开发同时具备Remote与Local接口的无状态Session Bean: - 讨论如何同时支持远程和本地接口访问的策略。 - **有状态Session Bean**: - 描述有状态Session Bean的生命周期管理机制。 - **无状态与有状态...

    EJB系统开发实战录之四

    在上述配置中,`&lt;type&gt;`标签指定了Bean的类型为`Stateless`,而`&lt;local-home&gt;`和`&lt;local&gt;`标签则分别定义了本地家庭接口和本地接口的全限定名。 #### 五、总结 通过本文的介绍,我们深入了解了EJB中的Session Bean...

Global site tag (gtag.js) - Google Analytics