`

Spring学习笔记(六)——Spring消息服务-JMS

阅读更多
JMS即java消息服务。在JMS中JMS消息并不同应用直接交互,而是同JMS服务器的目的地(destination)进行交互,比如点对点(P2P)或者发布/订阅(Publish/Subscribe)。发送消息的应用程序不关注接收消息的应用程序是否正常工作,接受消息的应用程序也不关注发送消息的应用程序。他们仅仅同目的地进行交互。
Spring提供了JMS服务抽象框架,以简化对JMS API的使用。同时还能屏蔽不同JMS版本间的差异性。
1.背景
JMS,是能够异步处理客户请求的开发模型。为了支持消息的异步处理,java/J2EE平台引入了JMS API。JMS支持两种消息模型:点对点和发布/订阅模式。
点对点模式的含义是:消息生产者将消息发布到Qqueue中,在随后的操作中将会有消息消费者从该Qqueue中将消息消费掉。一旦消息消费掉,Qqueue中将不再存在他,因此其他消息消费者将不能够获得已消费的消息。注意,尽管Qqueue支持同时存在多个消息消费者,但对于单个的消息而言,仅仅会有一个消息消费者消费它。
发布/订阅模式的含义:消息生产者(发布者)将消息发布到Topic中,与此同时将会有多个消息消费者(订阅者)消费发布到该Topic的消息。它与点对点不同,即发布到Topic的消息将会被所有已订阅该Topic的订阅者消费。注意,如果消息发往Topic中时,当时不存在消息监听者(即,订阅者不处于监听状态),则该消息将丢弃掉。但有一点特殊,如果某订阅者是持久订阅者,则该消息将保留到该持久订阅者消费掉该消息为止。
JMS1.0.2中定义了两种消息类型,即点对点和发布/订阅。在JMS1.1中,将两种的API合二为一为ConnectionFactory。同时,借助JMS1.0.2 API在同一Session中只能够同某类型的目的地经行交互;JMS1.1消除了这种开发限制,在同一个Session中能够同不同类型的目的地进行交互,更好的实现事务管理。

2.Spring对JMS提供的支持
JMS,能够保证客户/服务器间的可靠性,即保证消息消费者、生产者确实消费或者生产了消息。这对于企业应用而言至关重要。可靠性不仅仅需要从应用层面保证,更多的是从系统级、中间层得以保证。现在已经有一些可靠性规范来确保服务质量的可靠性。JMS的服务质量(QoS)对于这种松耦合的架构很重要。无论如何,JMS都是架构大型企业应用的主要利器之一。
对这种优秀的J2EE API,Spring提供了Spring JMS抽象服务。

2.1)JmsTemplate
在Spring框架提供的JMS抽象中,JmsTemplate同MessageCreator结合能够发送消息。开发者需要实现MessageCreator回调接口定义的createMessage方法。
通过JBoss提供的JMX控制台应用,能浏览到发送到JBossMQ的消息内容。
JmsTemplate模版在默认时,使用了P2P目的地类型,通过pubSubDomain属性能够改变目的地类型。

消息驱动Bean是接收消息的最好方式之一。JmsTemplate也支持消息的的接受操作。JmsTemplate提供的receive方法,能实现同步接收消息,通过设定receiveTimeout属性,可以指定线程阻塞的最大时间。使用receive方法接收消息时务必小心!
为了实现消息的异步接收,需要在应用中实现MessageListener接口。

JmsTemplate提供了各种send方法,供发送消息使用。其中,JmsTemplate中的convertAndSend和receiveAndConvert方法能够借助于MessageConverter接口实现将消息做相应的转换。MessageConverter接口定义了Java对象同JMS消息之间的简单约定。Spring框架的JMS抽象提供了MessageConverter的简单实现,即SimpleMessageConverter。借助于SimpleMessageConverter,开发者能够实现String与TextMessage、byte[]与BytesMessage、java.util.Map与MapMessage之间的自动转换。也可以自定义其他的MessageConverter接口实现。通过使用消息转换器,使得开发人员能更专注于业务逻辑,而不用关注JMS消息的具体内容。
默认时,如果不设置JmsTemplate的messageConverter属性,Spring会直接使用JMS抽象服务提供的org.springframework.jms.support.converter.SimpleMessageConverter。然而,为了修改消息本身的内容,用MessageConverter实现不了,需要借助于Spring提供的MessagePostProcessor接口。

2.2)事务管理:
Spring提供了JmsTransactionManager,用于管理单个JMS ConnectionFactory的事务。借助于JtaTransactionManager和具有XA能力的JMS ConnectionManager能够管理全局事务。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics