Ejb的本地接口

Ejb的本地接口  

2009-08-23 17:52:18|  分类: EJB|举报|字号 订阅

我们介绍过远程接口,在这里,我们需要了解一下通过远程接口调用ejb的过程,首先客户端需要与ejb建立起socket通信,在通信管道上他们之间需要来回发送IIOP协议消息,因为数据要在网络进行传输,存放数据的java对象必须要进行序列化。

在这个过程中我们看到,有网络通信的开销、协议解析的开销、对象序列化的开销。因为ejb是分布式技术,它允许客户端与ejb应用在不同一机器上面,所以这些性能开销也是必然的。但是在实际生产中,不可避免存在这种情况:客户端与EJB应用运行在同一个jboss中。这时候客户端访问ejb是否有必要走上面的网络通信呢?据我们所知,这时候客户端与ejb是在同一个jvm内,他们之间完全可以通过内存进行交互,这样就可以避免网络通信的性能开销。既然我们都想到了这一点,EJB专家组也想到了这一点,所以引入了本地接口。通过本地接口调用ejb,直接在内存中交互,这样就能避免因网络通信所造成的各种性能开销。但是有一点,大家必须注意,只有客户端与EJB应用在同一个JVM内运行的时候,我们才能调用本地接口,否则只能调用远程接口。什么情况下客户端与EJB应用是在同一个JVM?简单地说只要客户端与ejb发布在同一个jboss内,我们就认为他们是在同一个JVM

比如我们在上面的例子的基础上再写一个本地接口

public interface HelloWorldLocal extends HelloWorld {

}

这个接口继承了前面的那个HelloWorld 接口,

现在实现类就是这样了

@Stateless //-->标注为无状态会话bean,默认的ejb名字就是“HelloWorldBean”,注意,开始字母没有小写,改名可以使用@Stateless(name="***")

@Remote(HelloWorld.class)//-->把接口定义为远程接口

@Local(HelloWorldLocal.class)//把这个接口定义为本地接口

public class HelloWorldBean implements HelloWorld {

public String say(String name) {

return name+ "说,世界你好";

}

}

其实这个HelloWorldBean可以不实现任何接口,只要这个类内部有其需要实现的那些接口的方法的实现就可以了。 但是一般情况下还是把这些接口都实现了,避免不必要的麻烦。

在重新把项目打成jar发布到jboss对应位置以后,jboss就会为这个ejb产生一个本地接口的jndi名称,这里应该是HelloWorldBean /local

本地接口如果想要在我们的程序中访问的话,就必须要求要客户端与ejb发布在同一个jboss内。我们前面开发的那个客户端是个普通的java项目,不能部署到jboss中,所以也无法访问这个本地接口,这里我们重新开发一个web工程,访问我们刚才新建立的本地接口对象。

作为一个示范,我们这个web应用很简单,只在jsp代码中写了点东西

代码如下。

需要注意的是:这个web项目最好把我们需要引用的那个ejb作为一个项目加到我们这个web项目中,这么做事为了方便我们使用ejb项目中的已经加载的各个jar和相关接口。

当ejb和client在同一个jboss中的时候,InitialContext中就不需要再制定参数了,系统会自动查找到相关信息。

 

   <%

try {

//初始化jndi上下文,这个上下文对象是从ip是localhost,所使用的端口是1099中获取,实际上就是本机的jboss服务器

//由于如果是一个真正的分布式,ip就应该是一个远程的服务器

InitialContext ctx = new InitialContext();

//从服务器上查找我们jndi名称为"HelloWorldBean/remote"的ejb

//注意这个HelloWorld接口对象,这个接口的jar是我们自己加到当前项目中,它实际上就是"HelloWorldBean/remote"中的那个远程接口对象

//如果我们使用的是远程服务器,这个"HelloWorldBean/remote",就会通过网络被传送到本地client。这就是为什么ejb可以实现分布式

HelloWorld helloworld = (HelloWorld) ctx.lookup("HelloWorldBean/local");

out.println(helloworld.say("老张"));

} catch (NamingException e) {

System.out.println(e.getMessage());

}

       

    %>

写好这些以后我们需要把这个web项目打成一个war文件

这个时候,我们有一个严重的问题:

由于我们这个web项目中引用了前面那个ejb项目,所以在打成的war文件中的lib文件夹下就会有那个ejb的jar。而我们在jboss中已经部署了这个ejb的jar了,所以我们必须把这个jar删除,否则就会报类冲突异常。

上图中就是我们项目中引用的那个ejb,我们必须把它从我们的war文件中删除,否则就是类冲突异常。

然后我们就可以把刚才的那个war文件粘贴到jboss-4.2.3.GA\server\default\deploy文件夹

然后我运行jboss,在浏览器输入

http://localhost:8080/EJBWeb/index.jsp就可以看到效果

你可能感兴趣的:(学习新技术记录)