amq笔记:记一个关于PooledConnectionFactory的问题

替人排查一个关于amq链接数的问题,使用PooledConnectionFactory进行链接池管理,设置了链接数上限为3,但部署到服务器以后,瞬间创建了几百个链接,用netstat -an 查看,发现大部分到amq服务器的链接状态都是TIME_WAIT。服务器

初始化链接池:session

     ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory();
        ActiveMQPrefetchPolicy activeMQPrefetchPolicy = new ActiveMQPrefetchPolicy();

        activeMQConnectionFactory.setPrefetchPolicy(activeMQPrefetchPolicy);

        activeMQConnectionFactory.setUserName("XXX");
        activeMQConnectionFactory.setPassword("XXXX");
        activeMQConnectionFactory.setUseAsyncSend(true);
        activeMQConnectionFactory
                .setBrokerURL("failover:(tcp://XXXXX:XXXXX,tcp://XXXXX:XXXXX)?randomize=true");

        PooledConnectionFactory pooledConnectionFactory = new PooledConnectionFactory(
                activeMQConnectionFactory);
        pooledConnectionFactory.setMaximumActiveSessionPerConnection(10);
        pooledConnectionFactory.setMaxConnections(3);

 

发消息:dom

        try {
            MessageProducer producer = null;

            connection = pooledConnectionFactory.getConnectionFactory().createConnection();//此句大雾

            session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
            Destination destination = session
                    .createQueue("XXXXX");
            producer = session.createProducer(destination);
            producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);

            connection.start();
            TextMessage message = session.createTextMessage(sMessage);
            producer.send(message);

        } finally {
            if (session != null) {
                session.close();
            }
            if (connection != null) {
                connection.close();

            }
        }

用尽各类关键词都找不到类似的问题描述,最后仍是从代码下手,发现connection = pooledConnectionFactory.getConnectionFactory().createConnection();这一句用法比较怪异。最大链接数属性是针对pooledConnectionFactory设置的,pooledConnectionFactory自己有createConnection方法,为何还要把里面的connectionFactory取出来再建立呢?tcp

进代码里看,发现原来的代码引用的方法是取出链接池中的activeMQConnectionFactory后直接新建链接,调用close方法时关闭,根据TCP的工做原理,主动关闭的链接会保持一段时间的TIME_WAIT状态再行完全关闭。而pooledConnectionFactory的createConnection才是在进行链接池管理。所以,只要把建立链接的那句代码改成connection = pooledConnectionFactory.createConnection();就能够解决这个问题。fetch

相关文章
相关标签/搜索