当通过远程接口调用EJB时:
首先客户端需要与ejb建立起socket通信,在通信管道上他们之间需要来回发送IIOP协议消息,因为数据要在网络进行传输,存放数据的java对象必须要进行序列化
在这个过程中,有网络通信的开销、协议解析的开销、对象序列化的开销。因为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
选择刚才的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文件
将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:
让他既有本地接口,也有远程接口
优先调用本地接口
这样就可以使:当客户端与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的例子展示了如何利用注解简化开发流程,以及如何通过本地和远程接口进行组件间的通信。理解并掌握这些概念对于构建可扩展、健壮的企业级Java应用至关重要。通过学习这个示例,开发者...
在本教程中,我们将深入探讨EJB(Enterprise JavaBeans)3中的本地接口和无状态bean的开发。EJB是Java企业级应用的核心组件,用于构建可扩展、安全且可靠的分布式系统。EJB 3是其重要的一个版本,引入了诸多简化开发...
在本文中,我们将深入探讨如何在WebLogic环境中部署EJB 2.0,特别是实现本地接口的Session Bean。 EJB 2.0是Java EE早期版本中的组件模型,用于构建可复用、分布式的企业级服务。它定义了三种主要类型的Bean:...
- 实现无状态Session Bean时,不需要实现 javax.ejb.SessionSynchronization 接口,因为它们没有会话状态需要同步。 2. **有状态Session Bean** - 有状态Session Bean存储了客户端的上下文信息,允许在多个方法...
【ejb入门录像 sessionBean】是针对企业级Java应用(Enterprise JavaBeans,简称EJB)技术的初学者设计的一段教学视频。EJB是Java EE(Java Platform, Enterprise Edition)框架的重要组成部分,它提供了一种标准的...
3. 注解配置:使用注解如`@Remote`或`@Local`定义远程或本地接口,`@EJB`注解注入其他依赖的Bean。 五、部署和测试 1. 配置Jboss:在Jboss的部署目录下,添加EJB JAR文件或包含EJB的WAR/EAR文件。 2. 远程调用:...
在开始编写无状态的SessionBean之前,首先需要确保开发环境已经正确配置。以下是所需的主要组件: 1. **Eclipse**:版本3.4.2,推荐使用针对Java EE开发者的Eclipse版本。 2. **JBoss**:版本5.0.1,可以从官方网站...
- 当开发一个只有Local接口的无状态会话Bean时,需要使用`@Local`注解声明接口是本地接口。 - 当开发一个只有Remote接口的无状态会话Bean时,需要使用`@Remote`注解声明接口是远程接口。 - 如果既不使用`@Local`...
根据其对会话状态的处理方式,会话Bean主要分为两种类型:有状态会话Bean(Stateful Session Bean)和无状态会话Bean(Stateless Session Bean)。 ##### 无状态会话Bean(Stateless Session Bean) 无状态会话...
- 创建方法:用于生成 Bean 实例,无状态 Session Bean 有一个无参的创建方法,有状态 Session Bean 至少有一个,Entity Bean 可以有多个。 - Finder 方法:特定于 Entity Bean,根据指定条件在数据库中查找实体。...
- 创建方法:无状态Session Bean有一个无参的创建方法,有状态Session Bean至少有一个,Entity Bean可有0至多个。 - Finder方法:针对Entity Bean,用于在数据库中查找匹配的持久性数据。 - Home方法:仅适用于...
无状态Session Bean不保存任何客户端的会话信息,每个请求都被视为独立的。这种模式适用于处理计算密集型任务,而非存储用户状态。在EJB中,可以使用@Stateless注解定义无状态Session Bean。 3. **有状态 Session ...
- 开发同时具备Remote与Local接口的无状态Session Bean: - 讨论如何同时支持远程和本地接口访问的策略。 - **有状态Session Bean**: - 描述有状态Session Bean的生命周期管理机制。 - **无状态与有状态...
在上述配置中,`<type>`标签指定了Bean的类型为`Stateless`,而`<local-home>`和`<local>`标签则分别定义了本地家庭接口和本地接口的全限定名。 #### 五、总结 通过本文的介绍,我们深入了解了EJB中的Session Bean...