zoukankan      html  css  js  c++  java
  • 【Spring】org.springframework.jms.ResourceAllocationException分析

    背景:项目线上处理出现大量org.springframework.jms.ResourceAllocationException: Usage Manager Memory Limit reached. Stopping producer (ID:server-xxx-xxx-x:x:x,需要了解一下相关背景。

    跟ActiveMQ和Jms消息存储和通信相关。

    参考:

    https://www.cnblogs.com/davidwang456/p/4451757.html

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

    jms可以简单的分成两个功能区,消息的生产和消息的消费。

    JmsTemplate类用来生成消息和同步接受消息。对异步消息,spring也提供了许多消息监听容器用来创建消息驱动的POJO(MDPs)。spring同时也提供了创建消息监听器的声明方式。

    org.springframework.jms.core 提供了使用JMS的核心功能,它包含JmsTemplate类,它通过对资源的创建和释放处理来简化jms开发。

    spring的模板类作为一种设计原则在spring框架中广泛使用,模板类对简单操作提供了帮助方法;对复杂操作,通过继承回调接口提供了重要处理过程的代理。

    jmsTemplate同样遵循这一设计原则,它提供了发送消息、同步消费消息、为用户提供JMS session和消息生产者的多种便利方法。

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

    异常的转换在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);
        }
    复制代码

    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事务管理机制中。

    https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/jms/package-tree.html

    https://access.redhat.com/solutions/415063

    https://stackoverflow.com/questions/5291679/activemq-topic-flooding

    http://activemq.apache.org/producer-flow-control.html

    https://www.sourceallies.com/2014/10/activemq-memory-tuning/

    https://springframework.guru/spring-boot-example-of-spring-integration-and-activemq/

  • 相关阅读:
    linux 文件系统解析及相关命令
    2015暑假佛山移动实习个人总结——大三学生
    java 自动装箱自动拆箱
    java HashMap那点事
    STL学习笔记— —无序容器(Unordered Container)
    GNU C库「glibc」getaddrinfo 发现重大漏洞
    分布式缓存Memcache和Redis
    让你的动画不再生硬 Android插值器Interpolator使用秘籍
    安卓数据解析之 fastjson 的解析以及Gson解析
    (转)Unity3d使用心得(2):Unity3d 动态下载动画资源——AnimationClip 的使用
  • 原文地址:https://www.cnblogs.com/cathygx/p/13968464.html
Copyright © 2011-2022 走看看