深入探讨EJB中新的消息驱动组件 - 编程入门网
接之外,开发者还可创建并注册一个或多个使用Message Consumer的JMS Message Listener(消息监听者)接口。Message Listener总是在一个单独的控制线程中执行,这就意味着在编写消息监听者时,开发者不需要担心并发性问题的出现,见图2。
下面我给出了一个典型的JMS 消息监听者实现的代码。 代码段2:
在这个实现中,MessageListener接收到的消息中包含了股票报价,消息监听者只是简单的从消息体中取得股票报价并把它输出到标准输出流中。 开发一个健壮的JMS客户端程序可能是非常困难的,程序员必须要考虑可能会同时接受多个消息,此外还有交易安全性、并发性消息处理、对象生命周期、容错性和可扩展性,这些都是开发者急切地想从EJB服务器中找到的功能。不过直到现在,程序员们还不得不自己动手把这些技术结合在一起应用。 为了整合EJB1.1和JMS,JMS监听者必须要使用我们在代码段2中描述的方法来建立。JMS客户端程序必须参考一个stateless(无状态)的用于响应处理JMS消息的session组件,然后,JMS消息要传递给EJB。然而,JMS消息并不要求被序列化,这就意味着这条消息在传递到远程的EJB实例之前必须被转换成为有序的消息类或在消息监听者中部分地解构。而且,应用程序开发者还有责任管理JMS服务器之间的事务联系,以及处理EJB、消息和并发性,这些都是非常复杂的事情。 即使一个应用程序开发者能把上面的这些都完成,并且也有能力访问JMS提供者并取得消息,但显然,他需要编写一大堆的代码,这对于我们这些常人往往是不大可能实现的。EJB2.0解决了这个问题,它通过扩展EJB组件类型,为需要异步消息支持的组件开发者提供简化的解决方案——新的MessageDriven组件类型。 MessageDrivenBean组件 MessageDrivenBean被部署成为总是扮演信息消费者角色的客户端。MessageDrivenBean没有客户端视图,这就意味着其本地和远程调用接口都是不可用的。一个消息产生者发信息给一个主题或队列并且没有认识到一个事实--MessageDrivenBean正扮演着消息消费者的身份。这就导致了在基于系统的 JMS之间的宽松联结,并更多的考虑到了在集合一个分布式计算环境时应有的灵活性。 MessageDriven 组件没有对话状态,其实所有的组件实例当它们在没有处理消息时都是等价的。这有点和无状态的session组件的状态特征有些类似。把组件实例集中起来是管理MessageDriven组件实例的普遍而又有效的办法。 MessageDriven 组件必须以直接或间接的方法从接口javax.ejb.MessageDrivenBean中取得,而这个接口类则是从javax.jms.MessageListener接口得来并添加了两个方法。onMessage()方法是从javax.jms.MessageListener接口中继承来的,这个方法有唯一的参数,就是javax.jms.Message,可以是任何有效的JMS消息类型。这个方法显然不包括throw(抛出)子句,所以在处理消息时不会抛出任何应用程序异常。 当这个容器接收到消息,它首先从一个可用实例池中取得一个MessageDriven组件(见图4)然后把部署描述器中制定的任务与执行线程联系起来,使其能够传播安全上下文。此外,如果部署描述器需要事务上下文的话,容器也会设置与之 |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |