开发具有本地接口的无状态bean
我们需要了解以下通过远程接口调用EJB的过程,首先客户端需要与EJB建立起 socket通信,在通信官道上他们之间需要来回
发送IIOP协议消息,因为数据要 在网络进行传输,存放数据的java对象必须要进行序列化。
在这个过程中 我们看到,有网络通信的开销,协议解析的开销,对象序列化的开销。 因为ejb是分布式技术,它允许客户端
与EJB应用在不同一机器上面,所以这些性能开销 也是必然的。但是在实际生产中,我们不可避免这种情况,客户端与EJB应用
运行在同一 个JBOSS中,那么,这个时候客户端是否还有必要跟EJB之间走上面的网络通信呢? 据我们所知,这个时候的客
户端与EJB是在同一个JVM内,他们之间完全可以通过内存 进行交互,如果这样的话,完全可以避免上面流程的开销。所以引入
了本地接口 通过本地接口调用EJB,直接在内存交互,这样就可以避免因网络通信所造成的各种性能开销。
但是有一点,大家必须要注意的,只有客户端与EJB应用都在同一个JVM内运行的时候 ,我们才能调用本地接口,否则只能
调用远程接口。 简单的理解 ,只要客户端与EJB发布在同一个JBOSS内,我们就认为他们在同一个JVM
接口
package com.launch.out;
public interface HelloWord {
public String say(String name);
}
实现
package com.launch.impl;
import javax.ejb.Remote;
import javax.ejb.Stateless;
import com.launch.out.HelloWord;
@Stateless
//默认就是Local
@Local(HelloWord.class)
public class HelloWordBean implements HelloWord {
//@EJB Other other; 可以注入其他ejb对象 ,若果有多个是实现可以指定名称
// @Resource TimerService timeService 注入其他服务
// @Resource (mappedName="java:test") DataSource dataSource; 注入数据源
public String say(String name) {
return name+"how are you .";
}
}
打包成jar文件发布到jboss下
jsp 调用
需要打包war文件发布同一个jboss下
import="com.launch.out.HelloWord, javax.naming.*, java.util.Properties"%>
<%
Properties props = new Properties();
props.setProperty("java.naming.factory.initial", "org.jnp.interfaces.NamingContextFactory");
props.setProperty("java.naming.provider.url", "localhost:1099");
try {
InitialContext ctx = new InitialContext(props);
HelloWord helloworld = (HelloWord) ctx.lookup("HelloWordBean/local");
out.println(helloworld.say("how are you "));
} catch (NamingException e) {
out.println(e.getMessage());
}