关闭 x
IT技术网
    技 采 号
    ITJS.cn - 技术改变世界
    • 实用工具
    • 菜鸟教程
    IT采购网 中国存储网 科技号 CIO智库

    IT技术网

    IT采购网
    • 首页
    • 行业资讯
    • 系统运维
      • 操作系统
        • Windows
        • Linux
        • Mac OS
      • 数据库
        • MySQL
        • Oracle
        • SQL Server
      • 网站建设
    • 人工智能
    • 半导体芯片
    • 笔记本电脑
    • 智能手机
    • 智能汽车
    • 编程语言
    IT技术网 - ITJS.CN
    首页 » JAVA »Spring源码分析之spring-jms模块详解

    Spring源码分析之spring-jms模块详解

    2015-04-27 00:00:00 出处:ImportNew
    分享

    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);
            }
    
            // fallback
            return new UncategorizedJmsException(ex);
        }

    2. config模块

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

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

    public class JmsNamespaceHandler extends NamespaceHandlerSupport {
    
        @Override
        public 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的使用。

    上一篇返回首页 下一篇

    声明: 此文观点不代表本站立场;转载务必保留本文链接;版权疑问请联系我们。

    别人在看

    Destoon 模板存放规则及语法参考

    Destoon系统常量与变量

    Destoon系统目录文件结构说明

    Destoon 系统安装指南

    Destoon会员公司主页模板风格添加方法

    Destoon 二次开发入门

    Microsoft 将于 2026 年 10 月终止对 Windows 11 SE 的支持

    Windows 11 存储感知如何设置?了解Windows 11 存储感知开启的好处

    Windows 11 24H2 更新灾难:系统升级了,SSD固态盘不见了...

    小米路由器买哪款?Miwifi热门路由器型号对比分析

    IT头条

    Synology 对 Office 套件进行重大 AI 更新,增强私有云的生产力和安全性

    01:43

    StorONE 的高效平台将 Storage Guardian 数据中心占用空间减少 80%

    11:03

    年赚千亿的印度能源巨头Nayara 云服务瘫痪,被微软卡了一下脖子

    12:54

    国产6nm GPU新突破!砺算科技官宣:自研TrueGPU架构7月26日发布

    01:57

    公安部:我国在售汽车搭载的“智驾”系统都不具备“自动驾驶”功能

    02:03

    技术热点

    最全面的前端开发指南

    Windows7任务栏桌面下角的一些正在运行的图标不见了

    sql server快速删除记录方法

    SQL Server 7移动数据的6种方法

    SQL Server 2008的新压缩特性

    每个Java程序员必须知道的5个JVM命令行标志

      友情链接:
    • IT采购网
    • 科技号
    • 中国存储网
    • 存储网
    • 半导体联盟
    • 医疗软件网
    • 软件中国
    • ITbrand
    • 采购中国
    • CIO智库
    • 考研题库
    • 法务网
    • AI工具网
    • 电子芯片网
    • 安全库
    • 隐私保护
    • 版权申明
    • 联系我们
    IT技术网 版权所有 © 2020-2025,京ICP备14047533号-20,Power by OK设计网

    在上方输入关键词后,回车键 开始搜索。Esc键 取消该搜索窗口。