`

深入理解PooledConnectionFactory CachingConnectionFactory SingleConnectionFactory

阅读更多

PooledConnectionFactory实现ConnectionFactory接口。为因JmsTemlate每次发送消息时都会重新创建连接,创建connection,session,创建productor。这是一个非常耗性能的地方,特别是大数据量的情况下。因此出现了PooledConnectionFactory。这个类只会缓存connection,session和productor,不会缓存consumer。因此只适合于生产者发送消息。那为什么不缓存consumer呢?官方解释是由于消费者一般是异步的,也就是说,broker代理会把生产者发送的消息放在一个消息者的预取缓存中。当消息者准备好的时候就会从这个预取缓存中取出来进行处理。我想,这个只是在要求消息处理的及时性不是特别高的情况下。如果希望处理能够提高速度,自然也可以从这部分提高效率,减小不断创建consumer的时间(大数据量的情况下)。

 

CachingConnectionFactory类扩展自SingleConnectionFactory,主要用于提供缓存JMS资源功能。具体包括MessageProducer、MessageConsumer和Session的缓存功能。

publicclassCachingConnectionFactoryextendsSingleConnectionFactory{

privateint sessionCacheSize =1;

privateboolean cacheProducers =true;

privateboolean cacheConsumers =true;

privatevolatileboolean active =true;

privatefinalMap cachedSessions =newHashMap();



Spring中发送消息的核心是JmsTemplate,然而Jmstemplate的问题是在每次调用时都要打开/关闭session和producter,效率很低,所以引申出了PooledConnectionFactory连接池,用于缓存session和producter。然而这还不是最好的。从spring2.5.3版本后,Spring又提供了CachingConnectionFactory,这才是首选的方案。然而CachingConnectionFactory有一个问题必须指出,默认情况下,CachingConnectionFactory只缓存一个session,在它的JavaDoc中,它声明对于低并发情况下这是足够的。与之相反,PooledConnectionFactory的默认值是500。这些设置,在很多情况下,需要亲自去测试并验证。我将其设置为100,对我来说还是很不错。

 

SingleConnectionFactory类实现了ConnectionFactory, QueueConnectionFactory, TopicConnectionFactory,ExceptionListener接口。 

Spring提供ConnectionFactory接口的一个实现,SingleConnectionFactory, 它将在所有的createConnection()调用中返回同一个相同的共享连接对象, 并且忽略Connection.close()和stop()的调用。根据JMS连接模型,这是完全线程安全的(相反,如JDBC)。这个共享连接能够在出现异常时自动恢复创建一个新的共享连接。可以通过SingleConnectionFactory的构造函数中传入Connection对象或者 ConnectionFactory对象,用来创建被代理的连接对象。 SingleConnectionFactory.createConnection方法返回的连接是个代理,它忽略了对stop和close方法的调用 (连接会在SingleConnectionFactory.destroy方法中关闭)。

protectedConnection getSharedConnectionProxy(Connection target){
List classes =newArrayList(3);
classes.add(Connection.class);
if(target instanceofQueueConnection){
classes.add(QueueConnection.class);
}
if(target instanceofTopicConnection){
classes.add(TopicConnection.class);
}
return(Connection)Proxy.newProxyInstance(
Connection.class.getClassLoader(),
(Class[]) classes.toArray(newClass[classes.size()]),
newSharedConnectionInvocationHandler(target));
}


这在测试和独立的环境中相当有用, 因为同一个连接可以被用于跨多个监听容器的JmsTemplate调用以跨越多个事务。 SingleConnectionFactory接受一个通常来自JNDI的标准ConnectionFactory的引用。 
另外spring的消息监听容器都支持一个共享的connection在多个监听容器中使用。结合SingleConnectionFactory才真正让人感受到跨多个监听容器共享同一个JMS连接的功能。

在Java EE环境中,SingleConnectionFactory将把Connection和Session放到缓冲池中,因此这些资源在事务中得到了有效的复用。在独立环境中使用Spring的 SingleConnectionFactory 会存在共享的JMS Connection,但每个事务有自己独立的 Session。另外可以考虑使用供应商特定的池适配器,,如ActiveMQ的 PooledConnectionFactory 类。

SingleConnectionFactory的reconnectOnException属性用来指定是否在连接抛出JMSException的时候,对连接进行重置,重置后如果再调用createConnection方法,那么会返回一个新的连接。 

SingleConnectionFactory不支持定义用户名和密码。

分享到:
评论

相关推荐

    ActiveMQ相关jar包--使用Connection连接池

    首先,理解`Connection`在ActiveMQ中的角色是至关重要的。一个`Connection`代表到ActiveMQ服务器的物理连接,它可以创建多个`Session`,每个`Session`又可以创建多个生产者和消费者。然而,频繁地创建和关闭`...

    activemq-pool源码

    理解`activemq-pool`源代码有助于开发者更好地定制和优化其在生产环境中的表现,如调整连接池参数以平衡资源利用率和响应时间,或者通过了解其内部工作原理来解决可能出现的连接问题。同时,深入研究`activemq-pool`...

    自己实现的ActiveMQ连接池和新版本ActiveMQ自带的连接池,封装好的工具类,可直接使用

    无论是自定义实现还是使用官方提供的PooledConnectionFactory,都需要深入理解其工作原理和配置选项,以便在项目中正确、高效地使用。这个资源为开发者提供了一个起点,帮助他们快速集成和管理ActiveMQ的连接资源。

    ActiveMQ整合Spring使用连接池

    本篇文章将深入探讨如何整合ActiveMQ与Spring,并利用连接池提升性能。 首先,我们需要理解JMS(Java Message Service),它是Java平台中用于异步消息传递的标准API。ActiveMQ作为JMS提供者,Spring通过其JMS模块...

    RabbitMQ客户连接池实现示例代码

    在这个示例中,我们将深入探讨如何使用RabbitMQ实现客户端连接池,以提高系统性能和资源利用率。连接池是一种管理数据库或消息中间件连接的机制,通过复用已存在的连接,减少频繁创建和关闭连接带来的开销。 首先,...

    rabbit2.zip

    首先,让我们理解什么是连接池。在大量并发请求下,频繁地创建和销毁连接会带来较大的性能开销。连接池的概念就是预先创建一定数量的连接,供多个客户端共享,从而减少创建和销毁连接的次数,提高系统效率。在...

    ActiveMQ开发实例-5

    在"ActiveMQ开发实例-5"中,重点在于实际操作和实践,通过C++和MFC实现消息的发送和接收,结合其他实例资源,你可以更深入地理解ActiveMQ的使用和功能。通过这个实例,开发者可以将消息队列技术有效地应用于自己的...

    ActiveMQ实例

    在这个实例中,我们将深入探讨ActiveMQ如何与Spring框架、Swing GUI和Ajax技术进行整合。 1. **ActiveMQ与Spring整合**: Spring框架是一个流行的Java企业级应用开发框架,它提供了全面的事务管理、数据访问集成、...

    ActiveMQ与spring整合封装

    在IT行业中,消息队列(Message Queue)是分布式系统中常用的一种组件,它负责处理应用程序之间的异步通信,提高系统...在实际应用中,还可以根据需求进行更深入的定制,比如添加事务支持、错误处理、消息确认机制等。

    Spring集成ActiveMQ

    1. **添加ActiveMQ库**:将ActiveMQ所需的所有jar包复制到项目类路径下,确保包含`PooledConnectionFactory`和`ActiveMQConnectionFactory`等关键类。 2. **添加Spring库**:导入Spring相关的jar包,以支持Spring的...

    ActiveMQ发送和接收protobuf协议消息的实例(精心整理,亲测可用)

    通过研究这些代码,你可以更深入地理解如何在ActiveMQ中使用protobuf进行消息通信。 总之,将protobuf与ActiveMQ结合使用,可以提高消息传递的效率和可靠性,尤其适合大数据量、高性能的系统。通过理解protobuf的...

    spring-mq完美整合示例

    在实际项目中,还可以根据需求进一步定制化,例如使用PooledConnectionFactory提高性能,或者利用Spring Boot简化配置,实现更快速的应用启动。 总之,Spring与ActiveMQ的结合不仅简化了消息队列的使用,还增强了...

    ActiveMQ连接池完整封装实例工具类

    在ActiveMQ中,我们可以使用PooledConnectionFactory来实现连接池。 以下是一个简化的ActiveMQ连接池工具类实现思路: 1. **初始化配置**:在工具类初始化时,需要配置ActiveMQ服务器的URL、用户名、密码等信息。...

    activemq-pool.jar.zip

    《ActiveMQ Pool库详解及其在Java开发中的应用》 ActiveMQ是Apache软件基金会下的一个开源消息中间件项目,它提供了一种高效、可靠且灵活的方式来...正确理解和使用这个库,对于优化基于ActiveMQ的消息系统至关重要。

    activemq-pool-5.4.1.jar.zip

    本文将深入探讨ActiveMQ Pool 5.4.1版本及其包含的JAR文件。 首先,ActiveMQ Pool是一个连接池库,主要用于管理和复用ActiveMQ的JMS连接。连接池的概念是基于对象池设计模式,通过预先创建并维护一定数量的连接,...

    RabbitMQ客户端连接池实现代码可直接复制项目中使用

    下面我们将深入探讨这个话题,讲解如何实现和使用RabbitMQ的客户端连接池。 首先,我们需要了解RabbitMQ的Java客户端库`rabbitmq-client`。这个库提供了一个`ConnectionFactory`类,用于创建到RabbitMQ服务器的连接...

    ActiveMQ的队列、topic模式

    本文将深入探讨ActiveMQ中的两种主要消息模式:队列(Queue)和主题(Topic)。 1. **队列(Queue)模式**: 队列模式遵循“发布/订阅”模型,但是一对一的。每个消息只能被一个消费者接收并处理。当一个消息被...

    activemq-pool-5.4.2.jar.zip

    《ActiveMQ Pool 5.4.2:理解与应用》 Apache ActiveMQ 是一个流行的开源消息代理,它基于 Java Message Service (JMS) 规范,用于在分布式系统中高效地处理异步通信。在标题提到的 "activemq-pool-5.4.2.jar.zip" ...

    jfianl整合activemq

    5. **性能优化**:在整合过程中,可能需要考虑性能优化,如使用PooledConnectionFactory池化连接,调整ActiveMQ的队列大小,以及设置合适的并发消费者数量。 6. **安全性**:确保ActiveMQ服务器和jfianl之间的通信...

Global site tag (gtag.js) - Google Analytics