Session Bean分为有状态Bean和无状态Bean,有状态Bean可以维护会话状态,无状态会话Bean不维护会话状态。开发一个Session Bean需要定义接口和Bean Class,其中接口分为远程(remote)和本地(Local)接口。EJB3.0不要求同时实现remote和local接口,但一般两者同时实现。EJB容器之外的应用要访问EJB只能通过remote接口,容器内的应用通过local接口和remote接口都可以访问,但使用local接口性能更好。
1. 无状态会话Bean不维护会话状态,一个Bean实例可以为多个用户服务,EJB容器使用实例池化技术管理无状态会话Bean。
2. 只实现Remote接口的无状态Session Bean
@Stateless
@Remote(MyHelloWorld.class)
public class MyHelloWorldBean implements MyHelloWorld {……}
3. @Stateless的定义
Package javax.ejb;
@Target(TYPE)
@Retention(RUNTIME)
Public @interface Stateless{
String name() default “”;
String mappedName default “”;
}
如 @remote({A.class,B.class,C.class})
4. Session bean开发完后打成jar包进行部署,可以使用Eclipse或者Ant进行打包任务。部署完后可以通过客户端进行访问。
本地接口:EAR-FILE-BASE-NAME/EJB-CLASS-NAME/local
远程接口:EAR-FILE-BASE-NAME/EJB-CLASS-NAME/remote
例如:将MyHelloWorld应用作为EJB模块(jar包)打包进MyHelloWorld.ear,它的远程接口的JNDI名称为:MyHelloWorld/MyHelloWorldBean/remote。
本地接口: EJB-CLASS-NAME/local
远程接口: EJB-CLASS-NAME/remote
例如:将MyHelloWorld应用打包成MyHelloWorld.jar文件,它的远程接口的JNDI名称为: MyHelloWorldBean/remote
5. EJB发布成功后,可以通过客户端进行访问,EJB发布在JBoss时,可以这样访问:
<%@ page language="java" import="java.util.Properties,javax.naming.*,com.csu.ejb3.MyHelloWorld" pageEncoding="GBK"%>
<%
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);
MyHelloWorld myHello = (MyHelloWorld)ctx.lookup("MyHelloWorldBean/remote");
out.println(myHello.sayHello("湖南"));
} catch (NamingException e) {
out.println(e.getMessage());
}
%>Context.INITIAL_CONTEXT_FACTORY:指定到目录服务的连接工厂
Context.PROVIDER_URL:目录服务提供者URL
//JBoss:
Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory"
Context.URL_PKG_PREFIXES, "org.jboss.naming"
Context.PROVIDER_URL, "localhost:1099"
//Weblogic:
Context.INITIAL_CONTEXT_FACTORY,"weblogic.jndi.WLInitialContextFactory"
Context.PROVIDER_URL, "t3://localhost:7001"
6. 只实现Local接口的无状态Session Bean
@Stateless
@Local({MyLocalHelloWorld.class})
public class MyLocalHelloWorldBean implements MyLocalHelloWorld {….}
7. 实现了Local接口和Remote接口的无状态Session Bean
@Stateless
@Remote(Operation.class)
@Local(LocalOperation.class)
public class OperationBean implements LocalOperation, Operation {…}
8 EJB容器使用实例池管理无状态Session Bean,使系统的吞吐量增大,类似于数据库连接池管理数据库连接对象。
Stateless Session Bean 的生命周期只有两个状态: does not exist 和 method-ready pool 。