UML软件工程组织

如何定义无状态会话类型EJB组件
作者:苏洋 本文选自:赛迪网 2002年12月05日

在前三次的讲座中,我们已经了解了EJB的基本结构及会话组件。在本讲中我们将创建一个用于获取税率的无状态会话类型EJB组件TaxRateEJB。在前面讲解关于无状态会话类型EJB组件特点时曾经介绍:在该类型的会话组件中不能够保持客户端应用状态,EJB容器可以利用同一无状态类型会话组件来处理不同的客户端请求,即使该EJB组件处于一个事务中。

EJB系列讲座

第一讲:分布式多层体系结构

第二讲:EJB基本结构解析

第三讲:EJB会话组件分析

定义EJB组件的Home接口

EJB2.0规范规定无状态会话类型EJB组件的Home接口继承EJBHome接口对象,用于定义客户端创建、查找和删除EJB组件对象实例的方法。该接口中只能包含一个没有任何参数的创建组件对象实例的create方法。遵循EJB2.0规范定义的该组件对象Home接口如下面代码所示:

//TaxRateHome.java
import javax.ejb.*;
import java.rmi.RemoteException;

public interface TaxRateHome extends EJBHome
{
TaxRate create() throws RemoteException,CreateException;
}

在该接口中定义的用于创建EJB组件对象实例的create方法必须返回该EJB组件对象的Remote接口并且该方法能够抛出RemoteException异常和CreateException异常。

定义EJB组件的Remote接口

EJB组件的Remote接口用于定义组件能够提供的商务方法,该接口继承EJBObject接口对象。

就本讲要创建的获取税率的无状态会话类型EJB组件而言,在Remote接口中需要定义返回税率值的getTaxRate方法。定义TaxRateEJB组件对象的Remote接口如下面代码所示:

//TaxRate.java
import javax.ejb.*;
import java.rmi.RemoteException;

public interface TaxRate extends EJBObject
{
float getTaxRate() throws RemoteException,UserException;
}

在TaxRateEJB组件对象的Remote接口中定义的getTaxRate方法用于客户端应用或其它EJB组件获取用于计算纳税额的税率。另外,在Remote接口中定义的组件商务方法除了抛出RemoteException异常外,还可以抛出用户定义类型异常UserException。该异常的定义代码如下:

//UserException.java
public class UserException extends Exception
{
private int errorNum;
public UserException(){super();}
public UserException( int errorNum )
{
super();
this.errorNum = errorNum;
}
}

由上面的用户异常类型定义代码可以看出:在创建EJB组件过程中定义的用户异常与通常JDK应用程序中创建的用户类型异常方式相同。

定义EJB组件类

无状态会话类型EJB组件的组件类用于定义在Home接口中定义的创建组件对象实例方法、在Remote接口中定义的组件商务方法以及SessionBean接口中的组件生命期控制方法。

实现Home接口中定义的create方法

为了将Home接口中定义的创建组件对象实例的create方法和该方法在组件类中映射的方法名称区分开,按照EJB规范的定义,在Home接口中定义的create方法在组件类中映射的方法名称为ejbCreate。EJB组件类中ejbCreate方法定义如下:

public void ejbCreate(){}

由该方法的定义可以看出:ejbCreate方法中没有任何实现代码,其原因何在呢?原因在于当EJB服务器启动后,EJB服务器根据部署其中的EJB组件类型和数量,在EJB容器中自动创建了无状态会话类型EJB组件对象实例。客户端应用调用无状态会话类型EJB组件对象Home接口中的create方法创建的不是组件对象实例,是在EJB容器中创建了用于和客户端应用之间进行交互的RMI远程对象。相对而言,客户端应用在调用有状态会话类型EJB组件对象Home接口中的create方法时,在EJB容器中除了创建RMI远程对象外,还创建有状态会话类型EJB组件对象实例。

当然,在无状态会话类型EJB组件类的ejbCreate方法中仍然可以定义获取TCP/IP连接或者利用JDBC进行数据库连接的代码。

实现Remote接口中定义的商务方法

在无状态会话类型EJB组件对象TaxRateEJB的Remote接口中定义了获取税率的商务方法getTaxRate。客户端应用或者其它EJB组件调用该方法获取用于计算纳税额的税率。GetTaxRate方法的实现代码如下:

float getTaxRate()
{ return 0.10f; }

由该方法的实现代码可以看出:该方法只是返回浮点数0.1作为税率而没有在该方法中定义其它保持客户端应用状态的代码。

实现SessionBean接口中定义的方法

从上一讲的SessionBean接口定义可以看出:该接口的定义中包括组件生命期控制方法以及设置组件实例对象的上下文方法。在组件生命期控制方法中,ejbRemove方法用于EJB容器调用该方法删除由ejbCreate方法创建的组件对象实例,ejbActivate方法和ejbPassivate方法用于将EJB组件在激活或关闭状态之间进行转换。

SessionBean接口中的SetSessionContext方法用于将EJB容器当前的上下文状态记录在会话类型EJB组件实例的会话上下文(SessionContext)对象实例中,当EJB容器再次调用该组件对象实例中的方法时能够获取该EJB组件的运行环境状态。

本讲创建的无状态会话类型EJB组件只是用于客户端应用或者其它EJB组件获取计算纳税额的税率,没有占用数据库连接等系统资源,因而不需要在EJB服务器端维护任何客户端应用状态。因此,在EJB组件类中只需编写上述方法的定义框架即可,不需要为这些方法编写任何实现代码,如下面代码所示:

public void ejbRemove(){}
public void ejbActivate(){}
public void ejbPassivate(){}
public void setSessionContext(SessionContext ctx){}

EJB组件类的定义框架

在TaxRateEJB组件对象的组件类定义中,包括3.1-3.3节中定义的各个方法以及一个该类的构造方法。该类定义的框架代码如下:

//TaxRateBean.java
public class TaxRateBean implements SessionBean
{
//3.1节中实现Home接口中定义的create方法
… …
//3.2节中实现Remote接口中定义的商务方法
… …
//3.3节中实现javax.ejb.SessionBean接口中定义的方法
… …
//构造方法
public TaxRateBean(){}
}

通过前面的讲解,您是否对EJB的无状态会话组件有个比较深入的了解呢?您可以在下面留下对此次系列讲座的看法和意见,也可以到开发者联盟与网友讨论。接下来,我们将开始进入有状态会话类型EJB组件及EJB实体组件的介绍,敬请关注。

(责任编辑 Sunny)



版权所有:UML软件工程组织