EJB中三种Bean的总结
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
EJB中三种Bean的总结
会话bean(session bean):负责与客户端交互,是编写业务逻辑的地方,在会话bean中可以通过jdbc直接操作数据库,但大多数情况下都是通过实体bean来完成对数据库的操作。
会话bean分为两种:
无状态会话bean (Stateful Session Bean):平常我们使用最多的是无状态bean,因为它的bean实例可供多个用户使用,所以它的性能比有状态bean高。
正因为一个bean实例被多个用户使用,那么前一个用户设置的值有可能被后一个用户所修改,所以它无法正确保存某个用户设置的值,因此是无状态的。
当客户机和服务器建立连接之后,无状态会话bean处理单一的用户请求或商务过程。
无状态会话bean不需要从以前的请求中提取任何状态。
例如,用户的用户密码确认。
用户输入密码后,发送请求。
组件返回真或假来确认用户,一旦过程完成,无状态会话bean也宣告结束。
如:
Java代码
1import javax.ejb.Remote;
2import javax.ejb.Stateless;
3import com.mixele.ejb3.HelloWorld;
4@Stateless //该注解指明这个程序是个无状态的会话Bean
5@Remote(HelloWorld.class)
6public class HelloWorldBean implements HelloWorld {
7@Override
8public String sayHello(String name) {
9return name + "Say: Hello,World!";
10}
11}
有状态会话bean (Stateless Session Bean):有状态bean平常使用的并不多,因为它的一个bean实例只供一个用户使用,所以性能开销比较大,正因为它的实例只被一个用户使用,用户为它设置的值是不会被其他用户修改,所以可以正确保存用户设置的值,因此是有状态的。
当客户机和服务器建立连接之后,状态会话bean将一直在客户机和服务器之间保持着用户的某个状态。
例如:用户使用银行的ATM时,经过验证之后,用户可以连续执行多次操作,在这个过程当中,用户的合法状态将一直被保留,直到她将信用卡取出,结束这次操作。
这时,状态会话bean也就被销毁。
Java代码
12@Stateful //该注解指明这个程序是个有状态的会话Bean
13@Remote(HelloWorld.class)
14@Local(HelloWorldLocal.class)
15public class HelloWorldBeanStateful implements HelloWorld, HelloWorldLocal { 16public String sayHello(String name) {
17return name + " Say: Hello,World! -- in HelloWorldBeanStateful";
18}
19}
有状态Bean只是在类的注解上使用了:@Stateful
在代码上有状态Bean和无状态Bean区别不大,但是却是用了Bean实例的两种管理技术,即:
1. 无状态bean使用实例池技术管理bean。
2. 有状态bean使用激活(activation)管理bean。
每个用户都有自己的Bean实例,相当于有多少个用户就有多少个Bean实例为之服务。
如果不采取任何机制,这样必然会导致服务器资源严重消耗,最后落个down机。
为了解决这个问题,EJB引入了激活机制。
激活机制实现的原理是这样的,在EJB服务器需要节省资源时,就从内存中收回bean实例,将其所保持的会话状态序列化到硬盘中,并且释放其所占有的内存,这个过程为钝化。
若此时客户端对EJB再次发起请求,EJB容器会重新实例化一个Bean实例,并从硬盘中将之前的状态恢复。
实体bean(entity bean):它实际上属于java持久化规范(简称JPA)里的技术,JPA的出现主要是为了简化现有的持久化开发工作和整合ORM技术,结束现在Hibernate、TopLink等ORM框架各自为营的局面。
实体bean用来表示持久存储库里的一个东西。
这通常就是指数据库里的一个东西,实体bean的一个实例就表示数据库表中的一行(不过,如果数据库得到了规范化,bean也有可能从多个表的数据行提取信息,也就是说,可能对应到多个表中的多个数据行)。
实体bean 的一个典型例子就是Customer(顾客),一个Customer实体bean可能表示Bo Olean,另一个Customer实体bean可能表示的是Trixia Lin。
实体bean只是数据模型,它不包括商务逻辑。
实体bean可以将关系/对象数据库的数据映射到内存中供其它组件使用。
实体bean是一直存在的,而且具有很高的容错性能。
实体bean 能供允许多用户同时访问。
如:
Java代码
20@Entity //标注该Bean为实体Bean
21@Table(name="person") //标注该Bean与数据库的person表进行映射
22public class Person implements Serializable {
23private static final long serialVersionUID = 1L;
24private Integer id;
25private String name;
26
27@Id //标注id属性是数据库表的主键,这个注解时实体Bean必须的
28@Column(name="id") //标注id属性与数据库表的id字段进行映射
29@GeneratedValue(strategy=GenerationType.AUTO) //指定主键生成策略
30public Integer getId() { return id; }
31public void setId(Integer id) { this.id = id; }
32@Column(name="name",length=20,nullable=false)
33public String getName() { return name; }
34public void setName(String name) { = name; }
35public int hashCode() { ………… }
36public boolean equals(Object obj) { ………… }
37}
消息驱动bean(message-driven bean):它是专门用于异步处理java消息的组件,具有处理大量并发消息的能力。
只有在需要一个JMS客户的时候才会实用消息驱动bean。
换句话说,消息驱动bean可以监听来自JMS消息服务的消息。
客户绝对不会直接调用消息驱动bean;要想让消息驱动做点什么事情,客户必须向一个消息服务发出一条消息。
这说明,消息驱动bean没有相应的EJBObject,因为服务器会从消息服务直接得到客户请求,而不是当客户向bean发出调用时截获客户请求。
NewCustomerNotification订购者就是一个典型的消息驱动bean。
消息驱动Bean(Message Driven Bean)
定义:消息驱动是专门用来处理基于消息请求的组件。
消息模型:点对点消息传递和发布/订阅消息传递
点对点消息传递模型:一条信息只能传递给一个队列接收方
发布/订阅消息传递:一条消息可以由多个接收者接收
详细解析:首先它是无状态的Session Bean,客户端调用MDB时,无需等待,可以立即返回,MDB会异步处理客户的请求;MDB必须实现MessageListener接口,当容器守候检测到一条队列信息时,将调用onMessage()方法。
适用范围:当一个业务执行很长,然后又无需将结果实时反馈客户时,适合使用MDB;如订单成功后向客户发送一条成功短信或者一封邮件。
Queue消息:(PTP消息传递模型)通过注解可以描述消息驱动的属性相关信息:
@MessageDriven(activationConfig =
{
@ActivationConfigProperty(propertyName="destinationType",
propertyValue="javax.jms.Queue"),
@ActivationConfigProperty(propertyName="destination",
propertyValue="queue/fashanshop"),
})
详解:@MessageDriven指明这是一个消息驱动,@ActivationConfigProperty注释配置信息的各种属性,destinationType指定消息类型为Queue队列,destination指定消息的路径;一旦队列到达指定的路径,则会触发onMessage方法,消息将作为参数传入。
----------------------------------------------------------------------------------------------------------------------------------------------------------------
Topic消息:(Pub/sub消息传递模型)通过注解可以描述消息驱动的属性相关信息:
@MessageDriven(activationConfig =
{
@ActivationConfigProperty(propertyName="destinationType",
propertyValue="javax.jms.Topic"),
@ActivationConfigProperty(propertyName="destination",
propertyValue="top/student"),
})
详解:@MessageDriven指明这是一个消息驱动,@ActivationConfigProperty注释配置信息的各种属性,destinationType指定消息类型为Topic队列,destination指定消息的路径;一旦队列到达指定的路径,则会触发onMessage方法,消息将作为参数传入。
总结创建JMS的步骤:
38查找JMS提供者(找到工厂)
39创建JMS连接(创建连接)
40创建JMS Session(创建session对象)
41查找JMS目的地(借助JNDI查找JMS目的地)
42创建JMS生产者或消费者(借助session和destination对象,客户能获得消息的生产者和消费者)
43发送或接收消息(构建消息,借助生产者发送,消费者接收)。