| http://www.zk168.com.cn 招考学习网 2006-4-11 3:08:48 |
|
| -----------------------------------------------------------[交流]-[打印]-[发送]-[收藏]-- |
|
| 深入探讨EJB中新的消息驱动组件(1) 提要: 我们可以使用MessageDrivenBean(消息驱动组件),在企业级的应用程序中进行异步的消息传送。 引言: Enterprise JavaBeans(EJB)1.1版本中定义了两种组件类型—session组件和entity组件。客户端对象可以同步调用EJB1.1的这两种组件的方法,然而,为了继承Message Oriented Middleware(MOM,面向对象的中间件)和Java Message Service(JMS,Java消息服务)的优点的需要,EJB框架中也相应的应当加入异步的消息通讯机制,所以,在EJB2.0中就定义了第三种组件类型----MessageDrivenBean(消息驱动组件) MessageDrivenBean兼备EJB和JMS的功能,当然,如果您想要消息操作技术,那么您大可只使用JMS就行了,但是新的消息驱动组件MessageDrivenBean提供了消息通讯的新的可能性。那么,这些组件如何整合到一个应用程序服务器框架中?他们的功能又如何扩大了过去JMS服务器的使用范围?让我们看下文吧!
EJB和JMS
前面我们已经说过了,EJB1.1种为开发者定义了两个企业级组件类型-----session和entity组件。session组件通常实现一些商业逻辑并且不能在多客户端共用。Entity组件则描述一个实体的面向对象的概念,而这个实体往往存在于像数据库那样固定的存储容器中。在这两种组件模型中,使用本地的或远程的接口来简化客户端的交互作用。按照定义,这种交互作用是严格的同步的。举例来说,通过一个方法调用把一个请求发送给组件,然后服务器对象返回一个响应。(如图1),
 然而,在企业版应用程序的范围中,也经常需要异步的消息传递,比方说,一个客户可能想发给服务器一条信息,但是并不需要或者不想要服务器做出应答,这时,客户端就没有必要等待服务器对象处理请求。对于客户端应用程序来说,在确保消息最终能够到达服务器并被正常处理的前提下,提交一条消息然后继续处理本身的事务,将会在很大的程度上提高效率。
能够处理异步消息的能力的Java技术可以在Java Message Service(JMS)中找到,JMS原本就是被开发来提供传统的Message Oriented Middleware(MOM)产品的一个标准Java接口。
现在,一些公司开发出了一整套新一代轻量级高效的纯Java的JMS产品,这些产品是开发者能够建立JMS连接来发布或从其它应用程序组件中接受消息。下面的例程给出了与一个JMS提供者接口的必要步骤: 代码段一:准备客户端
客户端应用程序使用了带有JMS 主题的MessageListener来接受和处理消息。
import javax.jms.*; /** *一个例程,演示如何取得一个JMS *连接并取得一个消息监听者。在本例中 *我们将获取一个与一个JMS主题的连接 */ public class JMSSample { public static void main (String args[]) { InitialContext context = new InitialContext(); // 查找主题 Topic topic (Topic)context.lookup("MyTopic"); file://取得我们创建JMS连接时所要用到的连接创建器 TopicConnectionFactory tcf = (TopicConnectionFactory)context.lookup( "TopicConnectionFactory"); // 创建JMS连接 TopicConnection conn = tcf.createTopicConnection(); // 从连接中创建JMS session。 // 这样我们就可以创建一个非事务处理、AUTO_ACKNOWLEDGE的连接 TopicSession session = conn.createTopicSession( false, Session.AUTO_ACKNOWLEDGE); // 创建主题订阅者 TopicSubscriber subscriber = session.createSubscriber(topic); // 监听者 subscriber.setMessageListener(myListener); // 指出我们将要接受信息的连接 conn.start(); } }
| 除了采用上面的步骤取得JMS MessageConsumer(消息消费者)的连接之外,开发者还可创建并注册一个或多个使用Message Consumer的JMS Message Listener(消息监听者)接口。Message Listener总是在一个单独的控制线程中执行,这就意味着在编写消息监听者时,开发者不需要担心并发性问题的出现,见图2。
 下面我给出了一个典型的JMS 消息监听者实现的代码。
代码段2:
/** * 这个类是JMS MessageListener的一个实现 * 用来处理包含股票报价的消息 */ class MyListener implements MessageListener { /** * 从收到的信息中取出股票报价 * 并且把它放入标准输出流中并显示。 */ public void onMessage(Message message) { // 从消息对象中取出报价 // 我们知道消息产生者发送TextMessages try { String quote = ((TextMessage)message).getText(); System.out.println("股票报价: " + quote); } catch(JMSException e) { System.out.println( "错误处理消息: "+message); } } }
| 在这个实现中,MessageListener接收到的消息中包含了股票报价,消息监听者只是简单的从消息体中取得股票报价并把它输出到标准输出流中。
开发一个健壮的JMS客户端程序可能是非常困难的,程序员必须要考虑可能会同时接受多个消息,此外还有交易安全性、并发性消息处理、对象生命周期、容错性和可扩展性,这些都是开发者急切地想从EJB服务器中找到的功能。不过直到现在,程序员们还不得不自己动手把这些技术结合在一起应用。
为了整合EJB1.1和JMS,JMS监听者必须要使用我们在代码段2中描述的方法来建立。JMS客户端程序必须参考一个stateless(无状态)的用于响应处理JMS消息的session组件,然后,JMS消息要传递给EJB。然而,JMS消息并不要求被序列化,这就意味着这条消息在传递到远程的EJB实例之前必须被转换成为有序的消息类或在消息监听者中部分地解构。而且,应用程序开发者还有责任管理JMS服务器之间的事务联系,以及处理EJB、消息和并发性,这些都是非常复杂的事情。
即使一个应用程序开发者能把上面的这些都完成,并且也有能力访问JMS提供者并取得消息,但显然,他需要编写一大堆的代码,这对于我们这些常人往往是不大可能实现的。EJB2.0解决了这个问题,它通过扩展EJB组件类型,为需要异步消息支持的组件开发者提供简化的解决方案——新的MessageDriven组件类型。
(未完待续)
|
| -----------------------------------------------------------[交流]-[打印]-[发送]-[收藏]-- |
友情提醒:
1.库中的资料大都来自互联网、网友上传、各类书籍,在录入的过程中难免会出现错误,恳请网 友来信指正!
2.如果网友在本库中未能找到所需要的材料,请登陆到我们的论坛《招考学习网》版块!
3.考友想加入招考学习网的编辑部,请发信到XueXiWang#Gmail.com(#改为@)附带个人简历
4.如需转载请注明出处及作者,谢谢合作!
5.如果您有更好的建议或意见请EMAIL:XueXiWang#Gmail.com (#改为@)
6.凡标题中有注有“[NO]”字样均不含答案且答案整理中.
7.如本库中转载文章涉及版权等问题,请相关网站或作者在两周内发邮件通知(EMAIL: XueXiWang#Gmail.com (#改为@))我们,我们接到通知后立即删除该文章及链接! |
|