0 概述

spring提供了一个jms集成框架,这个框架如spring 集成jdbc api一样,简化了jms api的使用。

jms可以简单的分成两个功能区,消息的生产和消息的消费。JmsTemplate类用来生成消息和同步接受消息。和其它java ee的消息驱动样式一样,对异步消息,spring也提供了许多消息监听容器用来创建消息驱动的POJO(MDPs)。spring同时也提供了创建消息监听器的声明方式。

org.springframework.jms.core 提供了使用JMS的核心功能,它包含JmsTemplate类,该类类似于jdbc中的jdbdTemplate,它通过对资源的创建和释放处理来简化jms开发。spring的模板类作为一种设计原则在spring框架中广泛使用,模板类对简单操作提供了帮助方法;对复杂操作,通过继承回调接口提供了重要处理过程的代理。jmsTemplate同样遵循这一设计原则,它提供了发送消息、同步消费消息、为用户提供JMS session和消息生产者的多种便利方法。

org.springframework.jms.support提供了JmsException转译功能。它将checked的JmsException层次转换成uncheckedd异常的镜像层次。若抛出的异常不是javax.jms.JmsException的子类,这个异常将被封装成unchecked异常UncategorizedJmsException。

org.springframework.jms.support.converter 提供了在java对象和jms消息之间转换的抽象MessageConverter。

org.springframework.jms.support.destination提供了管理jms destination的多种策略,如对存放在jndi的destionation提供服务定位功能。

org.springframework.jms.annotation通过使用@JmsListener提供了对注解驱动的监听端的支持。

org.springframework.jms.config 支持jms命名空间的解析,同时也支持配置监听容器和生成监听端。

最后,org.springframework.jms.connection提供了适用于standonle应用的ConnectionFactory的实现。它也了spring PlatFormTransactionManager对jms的事务管理实现jmsTranscationmanager. 这允许jms 作为事务资源无缝的集成到spring事务管理机制中。

1. 异常处理类模块

异常的转换在JmsUtils中来做的:

/*** Convert the specified checked {@link javax.jms.JMSException JMSException} to a* Spring runtime {@link org.springframework.jms.JmsException JmsException} equivalent.* @param ex the original checked JMSException to convert* @return the Spring runtime JmsException wrapping the given exception*/public static JmsException convertJmsAccessException(JMSException ex) {Assert.notNull(ex, "JMSException must not be null");if (ex instanceof javax.jms.IllegalStateException) {return new org.springframework.jms.IllegalStateException((javax.jms.IllegalStateException) ex);}if (ex instanceof javax.jms.InvalidClientIDException) {return new InvalidClientIDException((javax.jms.InvalidClientIDException) ex);}if (ex instanceof javax.jms.InvalidDestinationException) {return new InvalidDestinationException((javax.jms.InvalidDestinationException) ex);}if (ex instanceof javax.jms.InvalidSelectorException) {return new InvalidSelectorException((javax.jms.InvalidSelectorException) ex);}if (ex instanceof javax.jms.JMSSecurityException) {return new JmsSecurityException((javax.jms.JMSSecurityException) ex);}if (ex instanceof javax.jms.MessageEOFException) {return new MessageEOFException((javax.jms.MessageEOFException) ex);}if (ex instanceof javax.jms.MessageFormatException) {return new MessageFormatException((javax.jms.MessageFormatException) ex);}if (ex instanceof javax.jms.MessageNotReadableException) {return new MessageNotReadableException((javax.jms.MessageNotReadableException) ex);}if (ex instanceof javax.jms.MessageNotWriteableException) {return new MessageNotWriteableException((javax.jms.MessageNotWriteableException) ex);}if (ex instanceof javax.jms.ResourceAllocationException) {return new ResourceAllocationException((javax.jms.ResourceAllocationException) ex);}if (ex instanceof javax.jms.TransactionInProgressException) {return new TransactionInProgressException((javax.jms.TransactionInProgressException) ex);}if (ex instanceof javax.jms.TransactionRolledBackException) {return new TransactionRolledBackException((javax.jms.TransactionRolledBackException) ex);}// fallbackreturn new UncategorizedJmsException(ex);}

2. config模块

支持jms命名空间的解析,同时也支持配置监听容器和生成监听端。其结构如下:

其中,在JmsNamespaceHandler中使用到了监听容器,如下:

public class JmsNamespaceHandler extends NamespaceHandlerSupport {@Overridepublic void init() {registerBeanDefinitionParser("listener-container", new JmsListenerContainerParser());registerBeanDefinitionParser("jca-listener-container", new JcaListenerContainerParser());}}

3. connection模块

提供了适用于standonle应用的ConnectionFactory的实现。它也了spring PlatFormTransactionManager对jms的事务管理实现jmsTranscationmanager. 这允许jms 作为事务资源无缝的集成到spring事务管理机制中。其结构如下:

  JmsTemplate需要一个ConnectionFactory的引用,ConnectionFactory作为jsm规范的一部分,是作为和jms交互中一个关键因素,用来作为工厂创建和jms 提供者连接客户端应用的connection,并且封装了多种类型的配置参数,这些参数一般由jsm 提供者指明,例如ssl 配置选项。

  SingleConnectionFactory 创建连接时返回同一个连接Connectin而忽略了close()调用。它适用于测试环境和standalone环境,因为相同的connection可以被多个JmsTemplate调用,这些调用可以跨越多个事务。SingleConnectionFactory有一个可能来自于jndi的标准ConnectionFactory引用。

CachingConnectionFactory扩展了SingleConnectionFactory的功能,增加了session的缓存,MessageProducer和messageConsumer。缓存的初始化size设置为1,使用

4. core模块

  提供了使用JMS的核心功能。

  使用jmsTemplate时只需要继承callback接口,通过继承call接口可以定义一个高级别的协议,MessageCreator callback接口在指定session创建一个消息,它只可以被JmsTemplate调用。为满足更jms api更复杂的应用,SessionCallBack给用户提供了jms session,ProducerCallback暴露了session和messageProducer两个。

  jms api提供两种类型的send方法,一种设置delivery模式,优先级,存活时间(time-to-live)作为qos参数,另一种不提供qos参数而使用默认值。

5. Listener模块

消息监听容器(MessageListenerContainer)用来从jms 消息队列中接受消息,然后推送注册到它内部的消息监听器(MessageListener)中。spring提供了两种标准的jms 消息监听容器,特色如下:

SimpleMessageListenerContainer:在启动时,创建固定数目的jms 会话和一个消费者,使用标准的jms     MessageConsumer.setMessageListener()方法来注册监听器,让jms 提供者来让监听器返回。

DefaultMessageListenerContainer:支持在运行时动态适应,并且能参与到外部受管理事务。每个接收到的消息使用JtaTransactionManager注册为XA 事务,因而可以充分利用xa 事务语义进行处理。

6. remoting模块

org.aopalliance.intercept.MethodInterceptor 用来接收基于jms的远程服务。

JmsInvokerClientInterceptor:序列化远程触发对象和反序列化远程触发结果对象,使用java序列化方法,例如RMI.

JmsInvokerProxyFactoryBean:jms触发代理的工厂bean,暴露bean引用的代理服务,使用特定的服务接口。

JmsInvokerServiceExporter:jms消息监听器,暴露特定服务bean作为jsm消息的终端,通过jms 触发代理获取之。

小结

spring提供了一个jms集成框架,这个框架如spring 集成jdbc api一样,简化了jms api的使用。

转载于:https://www.cnblogs.com/davidwang456/p/4451757.html

spring源码分析之spring-jms模块详解相关推荐

  1. spring源码分析第六天------spring经典面试问题

    spring源码分析第六天------spring经典面试问题 1.Spring5 新特性及应用举例 2.Spring 经典的面试问题 a.什么是 Spring 框架?Spring 框架有哪些主要模块 ...

  2. bytebuddy实现原理分析 源码分析 (三)- advice 详解

    advice详解 八.advice 8.1 AsmVisitorWrapper 8.1.1 ForDeclareFields 8.1.1.1 Entry 8.1.1.2 DispatchingVisi ...

  3. spring源码分析之spring-web web模块分析

    0 概述 spring-web的web模块是更高一层的抽象,它封装了快速开发spring-web需要的基础组件.其结构如下: 1. 初始化Initializer部分 1.1  Servlet3.0 的 ...

  4. spring源码分析之spring-web remoting模块概况及基本概念

    spring-web总体分为三部分:caucho.httpinvoker.jaxws,其总体构造图如下: uml结构: 先看看网上搜索到的上述实现的原理吧:Spring RMI,Hessian/Bur ...

  5. Spring源码解析之 Bean与BeanDefinition详解

    文章目录 Spring解决的核心问题 Bean与BeanDefinition 代码验证BeanDefinition 代码运行测试 Spring容器主要流程 与BeanDefinition相关的类 At ...

  6. 从源码分析RocketMQ系列-MQClientInstance类详解

    导语   在之前的分析中,看到有一个类MQClientInstance,这个无论是在Producer端还是在Consumer端都是很重要的一个类,很多的功能都是从这个类发起的,这边分享中就来详细的看看 ...

  7. Spring源码分析3 — spring XML配置文件的解析流程

    1 介绍 创建并初始化spring容器中,关键一步就是读取并解析spring XML配置文件.这个过程比较复杂,本文将详细分析整个流程.先看涉及到的关键类. XmlWebApplicationCont ...

  8. Spring源码分析4 — spring bean创建和初始化

    1 介绍 创建并初始化spring容器中,refresh()方法中解析xml配置文件,注册容器后处理器,bean后处理器,初始化MessageSource,ApplicationEventMultic ...

  9. spring源码分析之spring注解@Aspect是如何工作的?

    AOP(Aspect Orient Programming),面向切面编程,是面向对象编程OOP的一种补充.面向对象编程是从静态角度考虑程序的结构,面向切面编程是从动态的角度考虑程序运行过程. AOP ...

  10. spring源码分析之spring jmx

    JMX架构定义: https://docs.oracle.com/javase/8/docs/technotes/guides/jmx/overview/architecture.html Archi ...

最新文章

  1. MATLAB学习笔记(二)
  2. 风险评估资产重要性识别_如何有效的进行风险评估?
  3. c# 多线程 调用带参数函数
  4. junit5和junit4_JUnit 5 –基础
  5. 前端学习(2344):打包和部署
  6. 普渡大学计算机硕士申请条件,普渡大学计算机科学硕士专业申请要求
  7. MFC工作笔记0006---#pragma warning(disable:4996)是什么意思
  8. 小颗粒积木步骤图纸_【小颗粒积木赛回顾】参与者图鉴,中华街带来耐心与热情...
  9. 从技术转管理,我做了什么来拯救自己?
  10. caffe手写数字识别-训练模型
  11. app商品详情原数据 API ——淘宝/天猫
  12. matlab二阶系统曲线,基于matlab的二阶系统的阶跃响应曲线分析
  13. 18650锂电池保护板接线图_锂电池保护板几种接线方法
  14. HOG特征,LBP特征,Haar特征(图像特征提取)
  15. 如何从 GitHub 上下载指定项目的单个文件或文件夹
  16. grub rescue救援模式的处理
  17. KindEditor 图片粘贴上传,实现图文粘贴,图片自动上传
  18. 牛客2019跨年AK场
  19. 超图对接伟景行osg数据使用说明
  20. 2018/2019款 MacBookPro 接口失灵的原因及解决方案

热门文章

  1. swift 同步 网络请求_IOS开发中异步网络请求上实现同步逻辑
  2. python中find函数忽略大小写_python字符串(大小写、判断、查找、分割、拼接、裁剪、替换、格式化)...
  3. linux扫描hba卡命令,如何在redhat中查看HBA卡的信息
  4. 银行家算法的分析与实现
  5. 页面重新加载_Chrome为PWA应用加入了返回和重新加载按钮
  6. 苹果手机at系统_iOS14系统苹果手机如何设置充满电提示音?
  7. bulkwrite 批量插入_使用SqlBulkCopy批量插入数据
  8. 训练超参数, 出现 Cannot use GPU in CPU-only Caffe 错误?
  9. 安装MindStudio
  10. c++ static 静态变量初始化