Spring之集成之JMS(Java Message Service)

4 篇文章 0 订阅

23.1 介绍

Spring提供了一个JMS集成框架,其简化了JMS API使用,就像spring集成JDBC API。


JMS可以大略的分为两个功能点,即消息的产生和消费。JmsTemplate类用于消息创建和同步消息接收。对于异步接收与Java EE的消息驱动bean类型相似,Spring提供了大量的消息监听器容器,用于创建消息驱动的POJOs(MDPs)。

 org.springframework.jms.core包提供了使用JMS的核心功能。其包含了JMS模板类,指定了JMS的用法,通过处理资源的创建和释放,与JDBC的 JdbcTemplate很相似。设计原则,对于普通的Spring模板类,是提供辅助类执行普通的操作,对于更复杂的用法,处理任务的实质,是实现回调接口。

JMS模板遵循同样的设计。类提供不同方便的方法,处理消息的发送,异步消费消息并提供给用户JMS会话和消息创建器。


org.springframework.jms.support包提供了 JMSException转换功能。这个转换将检查型 JMSException等级转为非检查型异常层级。如果有检查型 javax.jms.JMSException异常的子类的提供器,这个异常封装为非检查型 UncategorizedJmsException异常。


org.springframework.jms.support.converter包提供了一个MessageConverter抽象,用于在Java对象和JMS消息之间转换。


org.springframework.jms.support.destination包提供了不同的策略来管理JMS目的,比如JNDI中的终点提供一个业务定位。


org.springframework.jms.config包为jms空间提供了解析实现类,如同Java配置提供了配置监听容器并创建监听端点。


最终,org.springframework.jms.connection包提供了ConnectionFactory实现类,这适用于单独的应用程序中。其也包含了针对JMS(命名为JmsTransactionManager)spring的PlatformTransactionManager的一个实现。这允许无缝整合JMS,将其事物资源整合到Spring的事物管理机制中。



23.2 Spring JMS的使用

23.2.1 JmsTemplate

JmsTemplate,这个类是JMS核心包中的核心类。其指定了JMS的使用,因为当发送或同步接受消息时,其处理资源的创建和释放。


使用JmsTemplate的编码只需要实现回调接口,并给定了一个清晰的高级约束。MessageCreator接口回调创建了一个消息,通过调用JmsTemplate的代码提供一个会话。为了更好地使用JMS API,SessionCallback回调提供了JMS会话的使用和回调ProducerCallback,暴露一个会话和MessageProducer。


JMS API提供了两类发送方法,一个是分发模式,优先使用,并超时时间作为QOS参数,另一个是没有QOS参数,其使用默认的值。由于在JmsTemplate有许多发送方法,QOS参数封装为一个bean属性,来避免在发送方法中重复设置。同样地,异步接受调用的超时值的设置使用属性setReceiveTimeout完成。


一些JMS提供器允许系统默认设置QOS值,通过ConnectionFactory的配置。MessageProducer发送方法send(Destination destination, Message message)使用不同的QOS的默认值比那些在JMS规范中使用那些指定的值更有效果。为提供QOS值得统一管理,因此JmsTemplate必须通过设置isExplicitQosEnabled属性为true来使用其自己的QOS值。


注意:JmsTemplate类的实例一旦配置即为线程安全的。这很重要,因为意味着你可以设置JmsTemplate的单一实例,并稍后安全地将共享引用注入到多个合作者。要清楚,JmsTemplate是有状态的,虽然其保有了一个ConnectionFactory的引用,但是这个状态不是会话状态。


自Spring框架 4.1起,JmsMessagingTemplate构建于JmsTemplate顶部,并提供了消息抽象的集成,即org.springframework.messaging.Message。这个允许你在一般的方式中创建发送的消息。


23.2.2 连接


JmsTemplate需要一个ConnectionFactory引用。ConnectionFactory是JMS规范的一部分,并提供了JMS的入口点。由客户端应用程序作为一个工厂来创建JMS提供器的连接并封装多个配置参数使用,其中有许多是厂商规定的,比如SSL配置选项。


当在一个EJB中使用JMS时,厂商提供了JMS接口的实现,这样它们可以参与到声明式事物管理并执行连接池和会话处理。为使用这个实现类,Java EE容器一般要求你声明一个JMS连接工厂,作为EJB内部的resource-ref或者servlet的部署描述符。为确保EJB内部JmsTemplate的功能的使用,客户端应用程序应该确保其引用到ConnectionFactory的管理实现。


缓存消息资源

标准API包含了许多中间件对象。为发送一条消息,API执行流程如下:

ConnectionFactory---->Connection---->Session------>MessageProducer---->send


在ConnectionFactory和send操作之间,有三个中间件对象需要创建和销毁。为充分利用资源和提高执行效率,提供了两个ConnectionFactory的实现。


SingleConnectionFactory

Spring 提供了ConnectionFactory接口的实现类,SingleConnectionFactory,调用createConnection()将返回相同的Connection并忽略调用close()方法。这在测试和单独环境中很有用的,这样同样的连接可以用于多个JmsTemplate调用,其可以跨度许多事物。SingleConnectionFactory获取一个标准ConnectionFactory的引用(来自JNDI)。


CachingConnectionFactory

CachingConnectionFactory扩展了SingleConnectionFactory的功能并添加了缓存的会话,MessageProducers(消息生产者)和MessageConsumers(消息消费者)。初始缓存大小设置为1。,使用属性SessionCacheSize增加缓存会话的数量。注意真正缓存会话的数量比基于承诺模式缓存的要多,这样当SessionCacheSize设置为1的时候,实际上可能有四个缓存会话实例,每个对应一个AcknowledgementMode。消息生产者和消息消费者缓存在自己的会话中并在缓存时也考虑生产者和消费者唯一性属性。消息生产者缓存基于它们的目的地。消息消费者基于目的,选择器,非定位配送标示和订阅名缓存(如果创建永久的消费者)。








  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值