论坛登陆 用户名:  密 码:
设为首页  加入收藏
08年北京名校秋季招生
名牌院校免试入学宽进严出,突破考分限制,名校与你零距离,以下院校按报名先后顺序录取,24小时网上报名覆盖全国
  您现在的位置: 中国教育招生在线 >> IT >> JAVA认证 >> IT正文
深入探讨EJB中新的消息驱动组件(1)
 作者:佚名     2007-3-14 16:30:37        来源:不详  浏览次数:

 

 

 

 

 

 

 

 

深入探讨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组件类型。


(未完待续)


责任编辑:lss
  相关新闻
【新手入门】JSP中标签库的深入研究
深入掌握Java技术之EJB调用原理分析
深入浅出:XFire在SpringSide中的应用
Java中异常机制的深入研究
Java深入:认识class Class及其应用
Java深入:编写高级 JScript应用代码
深入解析Java的新特性assertion
与UML之父面对面,探讨提升软件产业的竞争能力
深入浅出 谈谈EJB自管理的事务
Java语言深入:编写高效的线程安全类
【新手入门】JSP中标签库的深入研究
看沧海变桑田 Web2.0中AJAX应用探讨(一)
看沧海变桑田 Web2.0中AJAX应用探讨(二)
热门技术探讨:学习Web 2.0的方向盘
深入讨论:Spring 2.0 带来的改进
深入浅出基于Java的代理设计模式
与UML之父面对面,探讨提升软件产业的竞争能力
深入浅出基于Java的建造设计模式
深入浅出基于Java的代理设计模式
Java语言深入:编写高效的线程安全类
  评论
现在有100人对本文发表评论
查看所有评论
 
推  荐
 
100本成功必读热销书
热门招生
  北京文理研修学院   前进大学
  北京明园大学   北京建设大学
  北京邮电大学世纪学院   北方工商管理学院
  联想软件定向委培班   香港数码动画学院
  青年企业管理研修学院   北京华夏管理学院
热门培训
网络化办公专家培训认证 电子科技大学软件学院
软件测试工程师培训认证 北大青鸟十大授权培训
IT硬件工程师培训认证班 北京环球雅思荷兰预科
JAVA开发工程师培训 潜能时代IT服务管理培训
网络信息化工程师培训 清华大学继续教育学院
论坛精选
 
有些细节是男人也该注意的风度!最容易读错的字
某强人手机里保存的30条短信 中国十大高薪职业
最感人的十大韩剧经典台词 嫁给工程师的N个理由
爆强!只有一句话的鬼故事 转贴教你如何做妖精
 女人一定要記住的話 女人最好别嫁给最爱的男人
城市联盟
 大连 上海 天津 广州 西安 深圳  天津  青岛  大连  福州  沈阳  青海  连云港  南京  吉林  厦门  威海  辽宁  呼和浩特
Copyright © 2006   www.edu999.com   All rights reserved. 中国教育招生在线  版权所有
北京市通信管理局[2004]字第552号函    京ICP证040442号