您的位置:首页 > 其它

EJB体系结构之EJB容器

2017-06-24 21:06 197 查看
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对象首先要实现EJBObject(javax.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可以支持不同类型的客户端,这些客户端都很容易访问到。
 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: