開發具有本地接口的無狀態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());
}