- 浏览: 890658 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (687)
- java (127)
- servlet (38)
- struts (16)
- spring (22)
- hibernate (40)
- javascript (58)
- jquery (18)
- tomcat (51)
- 设计模式 (6)
- EJB (13)
- jsp (3)
- oracle (29)
- RUP (2)
- ajax (3)
- java内存管理 (4)
- java线程 (12)
- socket (13)
- path (5)
- XML (10)
- swing (2)
- UML (1)
- JBPM (2)
- 开发笔记 (45)
- Note参考 (15)
- JAXB (4)
- Quartz (2)
- 乱码 (2)
- CSS (2)
- Exception (4)
- Tools (7)
- sqlserver (3)
- DWR (7)
- Struts2 (47)
- WebService (2)
- 问题解决收藏 (7)
- JBOSS (7)
- cache (10)
- easyUI (19)
- jQuery Plugin (11)
- FreeMarker (6)
- Eclipse (2)
- Compass (2)
- JPA (1)
- WebLogic (1)
- powerdesigner (1)
- mybatis (1)
最新评论
-
bugyun:
受教了,谢谢
java 正则表达式 过滤html标签 -
xiongxingxing_123:
学习了,感谢了
java 正则表达式 过滤html标签 -
wanmeinange:
那如果无状态的。对同一个任务并发控制怎么做?比如继承Quart ...
quartz中参数misfireThreshold的详解 -
fanjieshanghai:
...
XPath 元素及属性查找 -
tianhandigeng:
还是没明白
quartz中参数misfireThreshold的详解
EJB3的功能很是强大,但中小企业很少使用它做开发,一般应用SSH足以应付。JAVAEE是做什么的?她是分布式企业级应用的规范,那EJB就是为实现这样的应用而开发的。
什么是分布式应用?听着名字很大。比如咱们的在线支付系统,淘宝、china-pub和amazon等都支持支付宝在线支付。难道它们分别都要将支付宝模块放在自己的服务器上?完全没必要。支付宝模块单独放在一个服务器上,其他服务器使用(调用)那一个服务器上的支付宝就可以了。在现实应用中还有一些类似的将某一应用模块单独取出放到另一个服务器上,供其他应用使用。这就是分布式应用了。(分布在不同的服务器上的应用)
一、JAVAEE回顾
JAVAEE到底是什么呢?一图更清(JavaEE5.0):
昨天我们实现的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就是POJO(Plain old java object)+注解,这方面的知识我们已经在JPA中学习了。
三、EJB3中的SessionBean
SessionBean分为有状态SessionBean(StateFulSessionBean-sfsb)和无状态SessionBean(StateLessSessionBean-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。我们知道无状态Bean有Bean池,那有状态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("主题消息发送完毕!"); } } |
接收消息:
相关推荐
EJB (Enterprise JavaBeans) 3.0 是Java EE平台的一部分,它引入了大量的注解,以简化企业级组件的开发。以下是对EJB 3.0中一些关键注解的详细解释: 1. **@Id**:这个注解用于标记实体类的一个属性作为主键。它...
- **16.8.1 小结** 本章总结了EJB应用开发的核心概念和技术细节,为读者提供了全面的指南,以帮助他们在Java EE平台上构建健壮、可靠的分布式应用程序。 #### 16.9 参考资料 - **16.9.1 参考资料** 为了深入...
##### 1.6 小结 完成以上步骤后,就具备了开始JSF项目的基本条件。接下来可以深入学习JSF的具体用法。 #### 二、JSF应用实践 ##### 2.1 JSF准备 在开始JSF项目之前,需要准备好开发环境。这包括配置JDK、安装...
**小结:**EJB3.0和Spring在供应商独立性方面都有很好的表现,但Spring通过其灵活的DI机制,在这一领域提供了一种更为简单的方法来实现组件之间的解耦和管理。 #### 二、服务集成(Service Integration) EJB3.0在...
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学习经验的小结分享中,文中首先提出了JSP应用的两种基本组合模式:对于简单的应用,建议采用JSP+BAEN的组合方式;而对于复杂的系统,则应考虑使用JSP+EJB的组合。这种组合方式的建议说明了在不同复杂度的...
本文将根据《J2EE开发架构小结》的文件内容,深入探讨J2EE开发架构的多种实现方式,以及每种架构的特点和应用场景。 ### 宏观架构视角 在宏观层面,J2EE架构遵循分层原则,通常分为表现层、业务层、访问层和资源层...
一些Java细节 设计性事务处理 铭记要点 小结 第21章 开发EJB客户机 引言 EJBs的客户机 小结 第22章 开发可扩缩的EJB应用程序 引言 Enterprise JavaBeans的优点 EJB的广阔开放空间...
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章 在...
**RMI(Remote Method Invocation)入门小结** 远程方法调用(RMI)是Java平台上的一个关键特性,它允许Java对象在不同的JVM(Java虚拟机)之间进行交互,从而实现分布式计算。RMI是Java开发分布式应用程序的基础,...
Java是世界上最流行的编程语言之一,尤其在企业级应用开发中占据主导地位。...这只是Java J2SE和J2EE学习中的一小部分,要成为一名出色的Java开发者,还需要不断深入学习和实践,掌握更多的高级特性、框架和最佳实践。
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语言基础知识 ◇课前索引 ◇2.1 简单数据类型 ◇2.2 运算符和表达式 ◇2.3 控制语句 ◇2.4 数组 ◇2.5 字符串的处理 ◇本讲小结 ◇课后习题 ★ 第三讲 Java语言...
◇本讲小结 ◇课后习题 ★ 第二讲 Java语言基础知识 ◇课前索引 ◇2.1 简单数据类型 ◇2.2 运算符和表达式 ◇2.3 控制语句 ◇2.4 数组 ◇2.5 字符串的处理 ◇本讲小结 ◇课后习题 ★ 第三讲 Java语言...
◇本讲小结 ◇课后习题 ★ 第二讲 Java语言基础知识 ◇课前索引 ◇2.1 简单数据类型 ◇2.2 运算符和表达式 ◇2.3 控制语句 ◇2.4 数组 ◇2.5 字符串的处理 ◇本讲小结 ◇课后习题 ★ 第三讲 Java语言...
◇本讲小结 ◇课后习题 ★ 第二讲 Java语言基础知识 ◇课前索引 ◇2.1 简单数据类型 ◇2.2 运算符和表达式 ◇2.3 控制语句 ◇2.4 数组 ◇2.5 字符串的处理 ◇本讲小结 ◇课后习题 ★ 第三讲 Java语言...
### JavaSE与JavaEE基础部分小结 #### JavaSE 基础知识点 ##### Java语言特点 1. **跨平台性**:Java的核心优势之一在于它的可移植性,即“一次编写,处处运行”。这意味着Java程序可以在任何安装了Java运行环境...
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 ...