`

EJB 小结

    博客分类:
  • EJB
阅读更多

EJB3的功能很是强大,但中小企业很少使用它做开发,一般应用SSH足以应付。JAVAEE是做什么的?她是分布式企业级应用的规范,那EJB就是为实现这样的应用而开发的。

什么是分布式应用?听着名字很大。比如咱们的在线支付系统,淘宝、china-pubamazon等都支持支付宝在线支付。难道它们分别都要将支付宝模块放在自己的服务器上?完全没必要。支付宝模块单独放在一个服务器上,其他服务器使用(调用)那一个服务器上的支付宝就可以了。在现实应用中还有一些类似的将某一应用模块单独取出放到另一个服务器上,供其他应用使用。这就是分布式应用了。(分布在不同的服务器上的应用)

一、JAVAEE回顾

JAVAEE到底是什么呢?一图更清(JavaEE5.0):

wps_clip_image-9153

昨天我们实现的EJB组件接口使用的是“@Local”注解,此注解只提供给本地调用。外部机器无法访问。因为外部用户与本地不在同一个虚拟机中。我们编写的EJB组件不主要是给外部用户访问而使用分布试应用吗?正是。所以为了让外部机器可以使用,我们需要将“@Local”注解修改为“@Remote”注解。在外部调用远程的EJB组件时,应该这样使用:

InitialContext ctx = new InitialContext();

HelloWorld hw = (HelloWorld)ctx.lookup("HelloWorldBean/remote");

String str = hw.sayHello("changcheng");

二、EJB3中的EntityBean

EJB3中的EntityBean就是POJOPlain old java object+注解,这方面的知识我们已经在JPA中学习了。

三、EJB3中的SessionBean

SessionBean分为有状态SessionBeanStateFulSessionBean-sfsb)和无状态SessionBeanStateLessSessionBean-slsb)。

1.StateLessSessionBean

我们在之前是做的练习中,一般都有一个DAO层。DAO层不记录用户的状态,所以我们在使用EJB开发时,可以直接将DAO层定义为无状态Bean

如何定义无状态Bean,我们在昨天的练习中使用的就是无状态Bean。直接在类上添加“@Stateless”注解,即可将类定义为无状态的Bean

每次产生一个新的会话,EJB容器需要为会话创建相关的无状态Bean对象,无疑这会为服务器带来极大的资源开销。我们在学习JDBC时,使用了线程池专门用来处理用户与数据库的连接。因为无状态Bean不记录用户的状态,所以EJB3中也定义了无状态的Bean池。这样大大节省了用户访问的时间与服务器资源的开销。

无状态Bean具有两个事件,创建后和销毁前。我们在方法上添加“@PostConstruct”注解,此方法将在无状态Bean创建后调用,我们在方法上添加“@PreDestroy”注解,此方法将在无状态Bean销毁后被调用。

2.StateFulSessionBean

有状态Bean的典型案例是购物车,购物车需要记录用户购买的商品,所以它是有状态的Bean。我们知道无状态BeanBean池,那有状态Bean可否有Bean池呢?当然不可以。所以有状态Bean会给服务器带来极大的负担,能不用有状态Bean就不要使用有状态Bean

EJB3中也尽量减少有状态Bean所带来的负载,所以EJB3为有状态Bean添加了钝化和激活的功能。比如用户在超市购物,用户刚进入超市时推起购物车(CartBean对象,这个有状态Bean被创建)。当用户选择商品并谢谢购物车时(向CartBean对象添加状态)。突然用户有急事要离开一会,工作人员将购物车推到“等候区”(CartBean对象被钝化)。用户处理完事物之后回来继续购物,到“等候区”推出自己的购物车(CartBean对象被激活)。用户结账工取消购物时(CartBean对象被删除)。

EJB3中正是使用方法减少频繁创建有状态Bean所给服务器带来的负担,同时也为用户提供了方便。

EJB3中有状态Bean的事件:

1).有状态Bean被创建后:在某一方法上添加“@PostConstruct”注解,有状态Bean被创建后会调用此方法。

2).有状态Bean被钝化:在某一方法上添加“@PrePassivate”注解,调用此方法后,有状态Bean被钝化。EJB3容器会将此Bean序列化后,保存到硬盘上,并从内存中删除。有状态Bean需要实现“Serializable”接口。

3).有状态Bean被激活:在某一方法上添加“@PostActivate”注解,调用此方法后,有状态Bean被激活。EJB3容器会将此Bean反序列化后,放到内存中,并删除硬盘上的内容。

4).有状态Bean被销毁前:在某一方法上添加“@PreDestroy”注解,无状态Bean被销毁前会调用此方法。

5).有状态Bean被删除:在某一方法上添加“@Remove”注解,调用此方法后,通知EJB3容器删除有状态Bean。如果不添加“@Remove”注解,客户端将没有任何方式告诉服务器终止会话,结果将导致SFSB在超时后进行钝化至磁盘,再次超时后将对象销毁。在高并发的系统当中,无疑会有严重的性能问题。内存开销会居高不下,更不要提占用cpu和磁盘空间了。

四、EJB3中的消息驱动Bean

EJB3中的消息驱动分为队列消息(queue)和主题消息(Topic),是一种异步消息驱动。

1.队列消息

发送消息:

import javax.jms.*;

import javax.naming.InitialContext;

/**

 * 队列消息驱动bean

 */

public class MDBQueueApp {

public static void main(String[] args) throws Exception {

InitialContext ctx = new InitialContext();

//通过JNDI查找队列连接工厂,EJB自身包含的。

QueueConnectionFactory qcf = (QueueConnectionFactory) ctx.lookup("QueueConnectionFactory");

//通过连接工厂创建队列连接

QueueConnection qc = qcf.createQueueConnection();

//通过队列连接创建队列会话

QueueSession qs = qc.createQueueSession(false,Session.AUTO_ACKNOWLEDGE);

//通过JNDI查找可用队列,EJB3自身包含的。

Queue queue = (Queue) ctx.lookup("queue/testQueue");

//通过队列会话创建到指定队列的消息生产者

MessageProducer mp = qs.createProducer(queue);

//通过队列回话创建文本消息

TextMessage msg = qs.createTextMessage();

msg.setText("Hi,你好吗?队列消息");

//通过消息的生产者发送消息

mp.send(msg);

//释放资源

qs.close();

qc.close();

System.out.println("队列消息发送完毕!");

}

}

接收消息:

import javax.ejb.*;

import javax.jms.*;

@MessageDriven(activationConfig={@ActivationConfigProperty(propertyName="destinationType",propertyValue="javax.jms.Queue"),@ActivationConfigProperty(propertyName="destination",propertyValue="queue/testQueue")})

public class MyQueueMDB implements MessageListener {

public void onMessage(Message arg0) {

if(arg0 instanceof TextMessage){

try {

System.out.println("收到消息队列消息 : " + ((TextMessage)arg0).getText());

System.out.println("I'm fine,Thank you!");

} catch (Exception e) {

e.printStackTrace();

}

}

}

}

队列消息只能被一个接收都接收到,队列消息一旦被某个接收者接收到后,消息将从队列中消失。所以其他接收同一队列消息的接收者无法收到。这个第一个接收到队列消息的接收者是最后一次被添加的接收者。

2.主题消息

发送消息:

import javax.jms.*;

import javax.naming.InitialContext;

/**

 * 主题消息驱动bean

 */

public class MDBAppTopic {

public static void main(String[] args) throws Exception {

InitialContext ctx = new InitialContext();

//通过JNDI查找主题连接工厂,EJB3自身包含的。

TopicConnectionFactory tcf = (TopicConnectionFactory) ctx.lookup("TopicConnectionFactory");

//通过连接工厂创建主题连接

TopicConnection tc = tcf.createTopicConnection();

//通过主题连接创建主题会话

TopicSession ts = tc.createTopicSession(false,Session.AUTO_ACKNOWLEDGE);

//通过JNDI查找可用主题,EJB3自身包含的。

Topic topic = (Topic) ctx.lookup("topic/testTopic");

//通过主题会话创建到指定主题的消息生产者

MessageProducer mp = ts.createProducer(topic);

//通过主题回话创建文本消息

TextMessage msg = ts.createTextMessage();

msg.setText("Hi,你好吗?(主题消息)");

//通过消息的生产者发送消息

mp.send(msg);

//释放资源

ts.close();

tc.close();

System.out.println("主题消息发送完毕!");

}

}

接收消息:

import javax.ejb.*;

import javax.jms.*;

@MessageDriven(activationConfig={@ActivationConfigProperty(propertyName="destinationType",propertyValue="javax.jms.Topic"),@ActivationConfigProperty(propertyName="destination",propertyValue="topic/testTopic")})

public class MyTopicMDB implements MessageListener {

public void onMessage(Message arg0) {

if(arg0 instanceof TextMessage){

try {

System.out.println("收到主题消息 : " + ((TextMessage)arg0).getText());

System.out.println("我很好,谢谢!");

<span style

分享到:
评论

相关推荐

    EJB3.0注释小结

    关于EJB中注释的总结,方便查询。很有用滴!

    经典JAVA.EE企业应用实战.基于WEBLOGIC_JBOSS的JSF_EJB3_JPA整合开发.pdf

    2.10 本章小结 116 第3章 深入使用JSF 117 3.1 JSF事件机制 118 3.1.1 Java事件模型概述 118 3.1.2 Java事件模型示例 119 3.1.3 JSF事件模型 120 3.1.4 Action事件 122 3.1.5 值改变事件 125 3.1.6 生命周期事件 128...

    EJB3.0资料的总结

    EJB3.0资料小结,包括其规范和详细的解释

    JSP高级编程          

    1.5 本章小结 第2 章 Enterprise JavaBeans 2.1 EJB 技术简介 2.2 EJB 体系结构(一) 2.3 EJB 体系结构(二) 2.4 如何开发EJB(一) 2.5 如何开发EJB(二) 2.6 本章小结 第3 章 EJB 技术进阶 3.1 实体EJB 的开发技术之一...

    JSP高级编程(全)

    1.5 本章小结 第2 章 Enterprise JavaBeans 2.1 EJB 技术简介 2.2 EJB 体系结构(一) 2.3 EJB 体系结构(二) 2.4 如何开发EJB(一) 2.5 如何开发EJB(二) 2.6 本章小结 第3 章 EJB 技术进阶 3.1 实体EJB 的开发技术之一...

    Java数据编程指南

    一些Java细节 设计性事务处理 铭记要点 小结 第21章 开发EJB客户机 引言 EJBs的客户机 小结 第22章 开发可扩缩的EJB应用程序 引言 Enterprise JavaBeans的优点 EJB的广阔开放空间...

    从Java走向Java+EE+.rar

    1.5 小结 13 第2章 使用Jakarta Commons来简化开发 14 2.1 Jakarta Commons的功能和用法 14 2.2 小结 18 第3章 Java EE容器 19 3.1 什么是容器 19 3.2 Tomcat的安装和使用 20 3.3 小结 25 第4章 在...

    Java优化编程(第2版)

    小结 第4章 java核心类与性能优化 4.1 散列表类与性能优化 4.1.1 线程同步散列表类 4.1.2 设置arraylist初始化容量 4.1.3 arraylist与linkedlist 4.2 string类与性能优化 4.2.1 字符串累加与性能优化 4.2.2 字符串的...

    J2EE应用开发详解

    172 10.5 小结 177 第11章 EJB 179 11.1 EJB简介 179 11.1.1 EJB的特点 179 11.1.2 EJB类型与组成 180 11.1.3 EJB 3.0的新特性 181 11.2 元数据注释和部署描述符 181 11.2.1 元数据注释 181 11.2.2 部署描述符 182 ...

    清华大学JAVA教程

    ◇本讲小结 ◇课后习题 ★ 第二讲 Java语言基础知识 ◇课前索引 ◇2.1 简单数据类型 ◇2.2 运算符和表达式 ◇2.3 控制语句 ◇2.4 数组 ◇2.5 字符串的处理 ◇本讲小结 ◇课后习题 ★ 第三讲 Java语言...

    Java编程语言详细教程

    ◇本讲小结 ◇课后习题 ★ 第二讲 Java语言基础知识 ◇课前索引 ◇2.1 简单数据类型 ◇2.2 运算符和表达式 ◇2.3 控制语句 ◇2.4 数组 ◇2.5 字符串的处理 ◇本讲小结 ◇课后习题 ★ 第三讲 Java语言...

    JAVA 清华大学 教程

    ◇本讲小结 ◇课后习题 ★ 第二讲 Java语言基础知识 ◇课前索引 ◇2.1 简单数据类型 ◇2.2 运算符和表达式 ◇2.3 控制语句 ◇2.4 数组 ◇2.5 字符串的处理 ◇本讲小结 ◇课后习题 ★ 第三讲 Java语言...

    JAVA清华大学教程

    ◇本讲小结 ◇课后习题 ★ 第二讲 Java语言基础知识 ◇课前索引 ◇2.1 简单数据类型 ◇2.2 运算符和表达式 ◇2.3 控制语句 ◇2.4 数组 ◇2.5 字符串的处理 ◇本讲小结 ◇课后习题 ★ 第三讲 Java语言...

    Hibernate实战(第2版 中文高清版)

     1.5 小结   第2章 启动项目   2.1 启动Hibernate项目   2.1.1 选择开发过程   2.1.2 建立项目   2.1.3 Hibernate配置和启动   2.1.4 运行和测试应用程序   2.2 启动Java Persistence项目   2.2.1 ...

    JSP学习经验小结分享

    对简单应用,可采用JSP+BAEN,对复杂的应用系统,应采用JSP+EJB,SERVLET变的无足轻重。用JSP完全可替代它。 一、JSP工作原理 在一个JSP文件第一次被请求时,JSP引擎把该JSP文件转换成为一个servlet。而这个引擎本身...

    Java数据库编程宝典2

    1.6 小结 第2章 设计数据库 2.1 数据库设计应考虑的事项 2.1.1 项目规范 2.1.2 设计表 2.1.3 生成发票 2.2 引用完整性 2.2.1 通用完整性规则 2.2.2 特定于数据库的完整性规则 2.3 小结 第3章 SQL基础 ...

    Java数据库编程宝典4

    1.6 小结 第2章 设计数据库 2.1 数据库设计应考虑的事项 2.1.1 项目规范 2.1.2 设计表 2.1.3 生成发票 2.2 引用完整性 2.2.1 通用完整性规则 2.2.2 特定于数据库的完整性规则 2.3 小结 第3章 SQL基础 ...

    Java数据库编程宝典1

    1.6 小结 第2章 设计数据库 2.1 数据库设计应考虑的事项 2.1.1 项目规范 2.1.2 设计表 2.1.3 生成发票 2.2 引用完整性 2.2.1 通用完整性规则 2.2.2 特定于数据库的完整性规则 2.3 小结 第3章 SQL基础 ...

    Java数据库编程宝典3

    1.6 小结 第2章 设计数据库 2.1 数据库设计应考虑的事项 2.1.1 项目规范 2.1.2 设计表 2.1.3 生成发票 2.2 引用完整性 2.2.1 通用完整性规则 2.2.2 特定于数据库的完整性规则 2.3 小结 第3章 SQL基础 ...

Global site tag (gtag.js) - Google Analytics