JMS-PooledConnectionFactory(activemq-pool)

转载 2016年08月30日 10:28:43

转载:http://www.blogjava.net/ldd600/archive/2010/11/02/336755.html?opt=admin

PooledConnectionFactory有两个属性maxConnections,maximumActive。咋一看来,用人类的常识理解,maxConnection应该表示最大可建的connection数,maximumActive应该表示最大活跃的connection数,当pool中的连接数大于最大活跃数时,又超过idleTimeout会被回收线程回收到。

如果是这样理解的,就大错特错了。PooledConnetionFactory的这两个参数根本不是这个意思。

看一下PooledConnectionFactory的组成结构:


注:ConnectionPool其实存储的就是一个ActivemqConnection,起的名字真是蛋疼。

更糟的是上面两个属性也不是我们想的一样。maxConnections表示的是LinkedList中connection的数目。maximumActive表示的是SessionPool中session的最大数目。IdleTime是Connection的回收时间,回收时也不是多线程的,每次getConnection时,都会检测是否超时,如果超时,就是立即回收,此时立即重建,真蛋疼。SeesionPool是用Commons-pool实现的。

上图的结构表示的是一个PooledConnetion维护了一个Map,Map的Key可以是由username,password决定的, LinkedList维护了一个循环链表的ActivemqConnection。每次从LinkedList中的头部取出一个AactivemqConnection,然后再添加到尾部,简单的轮询式的负载均衡。而这些ActivemqConnection是可以被多线程重用的。Pool实现中也没有connection是否inactive的检测机制,因为ActivemqConnection有自己的heartbeat检测机制。每次发送或接收时候先从ConnectionPool中取出一个connection,如果Connection都用光了,就会重用在链表头部的Connection的SessionPool,所以一个Connection可能会被多个线程使用,但一个session只会对应一个线程,保证上下文隔离性。多线程同享一个物理信道,这需要Activemq有自己的拆包机制,才不会混乱。而上面提到的负载均衡,也没考虑到session的使用情况,可能我从头部拿出的connection的session pool已经被耗光,而尾部的connection session pool却很空闲,这样就要无辜的阻塞等待session。

这样看来在我们设置PooledConnection时,建议有条件的还是需要把maxConnections设置的大一些。它的默认值是1。maximumActive可以设的相对小一些,它的默认值是500,这值太大,担心内存溢出。IdleTime有条件的可以设置的大一些,增加connection的重用时间,默认值是30秒。

activeMQ性能优化--对象池管理connection

activeMQ的某个应用场景,消费者和服务器只需建立一个长连接,而生产者的情况集中在服务器,需要对服务器端的生产者连接进行优化。 首先maven引入jar包依赖 [java] vie...
  • yzh_2017
  • yzh_2017
  • 2016年12月18日 13:13
  • 1005

优化生产者连接工厂(带有session缓存)

之前的连接工厂中,JmsTemlate每次发送消息时都会重新创建connection、session、productor等对象,从而导致性能的下降,是否有类似pool的连接池协助我们提高性能呢?答案必...
  • songhaifengshuaige
  • songhaifengshuaige
  • 2017年01月07日 18:21
  • 1356

web activeMq连接池实现JMS消息发送连接管理

1.今天来说一下在使用到MQ时如果使用MQ的连接池。之前我也是没有注意到MQ也是有连接池的,后来因为系统之前实现每次创建和关闭链接消耗资源、宕机频繁,所以领导要求解决我才接触到。 我在网上看到的关于J...
  • lan12334321234
  • lan12334321234
  • 2017年04月11日 10:50
  • 118

编码实现MQ连接池实现JMS消息发送连接管理

 今天来说一下在使用到MQ时如果使用MQ的链接池。之前我也是没有注意到MQ也是有连接池的,后来因为系统之前实现每次创建和关闭链接消耗资源、宕机频繁,所以领导要求解决我才接触到。 我...
  • linuxarmsummary
  • linuxarmsummary
  • 2017年05月14日 01:44
  • 200

使用ActiveMQ时遇到的坑

最近项目要做一个消息系统,选来选去,最后锁定到了ActiveMQ上,但是在使用中遇到了一个坑,分享给大家。 在使用PooledConnectionFactory做连接池来优化的时候,我原先按照官方A...
  • u010186896
  • u010186896
  • 2015年06月04日 22:06
  • 3774

Kafka是什么,JMS是什么,常见的类JMS消息服务器,为什么需要消息队列(来自学习笔记)

1、Kafka是什么 Apache Kafka是一个开源消息系统,由Scala写成。是由Apache软件基金会开发的一个开源消息系统项目。  Kafka最初是由LinkedIn开发,并于...
  • toto1297488504
  • toto1297488504
  • 2017年06月18日 10:32
  • 2371

activemq使用PoolConnectionFactory中的问题与activemq jar版本问题

最近使用activemq来替代UDP进行消息的发送与接收,在整改项目中,踩了很多坑,为了给以后留下经验,总结了使用中遇到的问题。1 、 activemq的安装也遇到了一些问题,下次总结,总之流程时,先...
  • codeeee
  • codeeee
  • 2017年06月06日 22:17
  • 1129

蛋疼的PooledConnectionFactory

PooledConnectionFactory有两个属性maxConnections,maximumActive。咋一看来,用人类的常识理解,maxConnection应该表示最大可建的connect...
  • u013760858
  • u013760858
  • 2015年11月05日 16:21
  • 895

JVM调优-解决native heap持续增长

问题的提出,分析,请参考JNI——小心,内存怪兽出没 (简单的说起来,就是java进程占用了4G内存,但是折腾来折腾去,整个JVM的堆才100M上下,其余的内存凭空消失?刨根问底之后,原来是n...
  • d8111
  • d8111
  • 2015年04月24日 17:55
  • 1326

解决Cell重用内容混乱的几种简单方法,有些方法会增加内存

重用实现分析   查看UITableView头文件,会找到NSMutableArray*  visiableCells,和NSMutableDictnery* reusableTableCells两...
  • hbblzjy
  • hbblzjy
  • 2016年05月04日 15:55
  • 1189
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:JMS-PooledConnectionFactory(activemq-pool)
举报原因:
原因补充:

(最多只允许输入30个字)