EJB体系结构之EJB容器

xiaoxiao2021-02-28  50

EJB容器 EJB容器(中间件)EJB服务器环境中进行,EJB容器为EJB构件提供操作环境。

 

     主要来说,EJB容器管理一下的系统级问题:

     持久性(Persistence

     生命周期管理(Life Cycle Management

     安全性(Security

     事务管理(Transaction Management

     远程连接(Remote Connectivity

      管理底层的通信问题,而且对EJB构件的开发者和客户都隐蔽了通信问题。

EJB的组成

     EJB由一些类、接口、描述文件、注释和其他资源文件组成。

     Bean的第一部分是实现基本方法的类,这个类封装了实现的业务逻辑。这个类需要遵循一些规范,并要与一些严格定义的接口保持一致。对于不同类型的Bean要求也不一样。

     对于SessionBean:主要包含业务逻辑;

     对于EntityBean:主要包含数据逻辑;

     对于Message-driven Bean:主要包含一些消息处理逻辑。

EJB对象

EJB对象运行在EJB容器中,EJB容器通过Bean提供的方法来管理Bean。当客户端需要调用EJB时,并不直接与Bean类提供的方法打交道,客户端的调用被EJB容器截获,而EJB对象则充当了Bean类实例的代理,EJB对象是根据Bean类、某些接口和某些描述文件,并通过专门的工具来生成的,它负责和一些中间层API打交道。

EJB容器是客户端和Bean类之间的中间层,这个中间层负责管理一个能处理底层网络通信的对象,也就是EJB对象。

 

EJB对象可以看成Bean类的代理对象,它复制了Bean类的业务方法,并响应客户端的调用。

 

EJB对象首先要实现EJBObjectjavax.ejb.EJBObject)接口中定义的方法,然后实现用户定义的Remote接口中的方法。

 

EJB对象的创建、查找、删除

Home对象主要功能就是创建、查找、删除EJB对象,在物理上属于EJB容器的一部分,由专门工具自动生成。

EJB的三种类型

SessionBean

      SessionBean连接到J2EE服务器的一个单独的客户端。客户端通过调用会话Bean的方法来访问部署在服务器上的应用程序。会话Bean完成客户端的请求,从而对客户端隐藏了服务器内复杂的业务逻辑。

package EJBTest; /** * 一个简单无状态会话Bean * @author bobo * */ @Stateless(name="CaluculateEJB") public class CaluculateEJBBean { int value=0; public String incrementValue(){ value++; return "value increment by 1"; } }

何时用SessionBean 在任何给定时间,只有一个客户端访问这个Bean的实例。Bean的状态并不需要持久保持,只在一个时间段内使用。

EntityBean

      描述一个持久存储的对象。例如消费者、订单、产品等。J2EE中持久存储设备是一个关系型数据库。最典型的情况是一个EntityBean在一个底层数据库有一个表对应,而EntityBean的每一个实例对应表中的一行数据。

package EJBTest; import java.io.Serializable; @Entity @Table(name="EMPLOYEES") public class Employee implements Serializable { private int empId; private String eName; private double sal; @Id @Column(name="EMPNO",primary=true) public int getEmpId() { return empId; } public void setEmpId(int empId) { this.empId = empId; } public String geteName() { return eName; } public void seteName(String eName) { this.eName = eName; } public double getSal() { return sal; } public void setSal(double sal) { this.sal = sal; } public String toString() { StringBuffer buf=new StringBuffer(); buf.append("Class:") .append(this.getClass().getName()) .append("::") .append("empId:") .append(getEmpId()) .append("eName:") .append(geteName()) .append("sal:") .append(getSal()); return buf.toString(); } }

EntityBean特点: 持久性:处理数据库访问 容器管理的持久性(CMP)指EJB容器负责处理所有的数据库访问。Bean管理的持久性(BMP)指用户自定义EJB处理所有的数据库访问。

共享访问:可被多个用户共享,事务关系型:像关系型数据库表一样。主键:每一个Bean都有唯一标识的主键

Message-drivenBean

实现javax.jms.MessageListener接口和使用@MessageDriven注释该Bean来指定一个Bean是消息驱动Bean。 

package EJBTest; import java.util.Date; import java.util.Timer; @MessageDriven( activationConfig = { @ActivationConfigProperty(propertyName="connectionFactoryJndiName", propertyValue="jms/TopicConnectionFactory"), @ActivationConfigProperty(propertyName="destinationName", propertyValue="jms/myTopic"), @ActivationConfigProperty(propertyName="destinationType", propertyValue="javax.jms.Topic"), @ActivationConfigProperty(propertyName="messageSelector", propertyValue="RECIPIENT = 'MDB'") } ) /** *监听可配置JMS队列或者主题和通过当一个消息发送到队列或者主题 *调用它的onMessage()方法得到提醒的一个简单的消息驱动 *该Bean打印消息的内容 */ public class MessageLogger implements MessageListener { @Inject javax.ejb.MessageDrivenContext mc; public void onMessage(Message message){ System.out.println("onMessage()-"+message); try { String subject = message.getStringProperty("subject"); String inmessage = message.getStringProperty("message"); System.out.println("Message received\n\tDate: " + new Date() + "\n\tSubject: " + subject + "\n\tMessage: " + inmessage + "\n"); System.out.println("Creating Timer a single event timer"); TimerService ts = mc.getTimerService(); Timer timer = ts.createTimer(30000, subject); System.out.println("Timer created by MDB at: " + new Date(System.currentTimeMillis()) +" with info: "+subject); } catch (Throwable e) { // TODO Auto-generated catch block e.printStackTrace(); } } public void ejbTimeout(Timer timer){ System.out.println("EJB 3.0:timer with MDB"); System.out.println("ejbTimeout() called at:"+ new Date(System.currentTimeMillis())); return; } }

      应用程序间异步处理消息。以JMS消息监听者方式工作,很像一个事件监听者,只是用消息代替了事件。

总结:

EJB的优点 提供系统级服务,使Bean开发者可以专注业务问题的解决;客户端和服务端分离,客户端可不必管业务实现,和数据库访问等;可移植,可以把现有的Bean建立新的程序。这些应用程序可以在任何兼容的J2EE服务器上运行

 

何时使用EJB 当系统不断增长,用户不断增加,EJB运行位置对于客户端始终是透明的;EJB支持事务机制,来提供对共享资源并发访问的管理;EJB可以支持不同类型的客户端,这些客户端都很容易访问到。

 

转载请注明原文地址: https://www.6miu.com/read-673891.html

最新回复(0)